python 读写csv 文件锁定
时间: 2024-12-04 12:12:33 浏览: 29
在Python中,CSV(Comma Separated Values,逗号分隔值)文件是一种常见的数据交换格式,我们可以使用内置的`csv`模块或者第三方库如`pandas`来进行读写操作。当涉及到并发读写时,可能会遇到竞态条件的问题,即两个或多个线程同时访问同一文件可能导致数据错误。为了避免这种情况,可以使用锁机制来保证对文件的独占访问。
**使用`csv`模块**:
```python
import csv
import threading
lock = threading.Lock() # 创建一个全局锁
def read_csv(filename):
lock.acquire() # 获取锁
try:
with open(filename, 'r') as file:
reader = csv.reader(file)
for row in reader:
print(row)
finally:
lock.release() # 释放锁
def write_csv(filename):
lock.acquire()
try:
with open(filename, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Data'])
finally:
lock.release()
# 创建并启动线程
thread1 = threading.Thread(target=read_csv, args=(filename,))
thread2 = threading.Thread(target=write_csv, args=(filename,))
```
**使用`pandas`库**:
```python
import pandas as pd
from pandas import ExcelWriter
import warnings
warnings.filterwarnings('ignore') # 忽略警告
lock = threading.Lock()
def read_write_lock(file_name):
def wrapper(f):
def inner(*args, **kwargs):
with lock:
return f(*args, **kwargs)
return inner
if 'read' in file_name.lower():
return wrapper(pd.read_csv)
else: # assuming a Write operation
return wrapper(lambda df: df.to_csv(file_name, index=False))
# 使用装饰器锁定读写操作
read_csv = read_write_lock('data.csv')
df = read_csv('data.csv')
```
以上代码中,我们使用了Python的`threading.Lock()`创建了一个锁,并在打开文件以及完成操作后都尝试获取和释放这个锁,以此来防止并发时的数据混乱。
阅读全文