2010-06-30 48 views
16

Tôi cố gắng để đọc và ghi vào file CSV cùng:đọc và ghi trên cùng một tập tin csv

file1 = open(file.csv, 'rb') 
file2 = open(file.csv, 'wb') 
reader = csv.reader(file1) 
writer = csv.writer(file2) 
for row in reader: 
    if row[2] == 'Test': 
     writer.writerow(row[0], row[1], 'Somevalue') 

file csv của tôi là:

  • val1,2323,Notest
  • val2, 2323,Test

Vì vậy, về cơ bản nếu giá trị row[2] của tôi là Test Tôi wa nt để thay thế bằng Some new value. Mã trên cung cấp cho tôi các tệp CSV trống.

Trả lời

13

Bạn nên sử dụng tên tệp đầu ra khác nhau. Ngay cả khi bạn muốn tên là như nhau, bạn nên sử dụng một số tên tạm thời và cuối cùng đổi tên tập tin.

Khi bạn mở tệp ở chế độ 'w' (hoặc 'wb'), tệp này "bị xóa" - toàn bộ nội dung tệp biến mất. tài liệu Python cho open() nói:

... 'w' chỉ bằng văn bản (một tập tin hiện có cùng tên sẽ bị xóa), ...

Vì vậy, tập tin của bạn bị xóa trước khi chức năng csv bắt đầu phân tích nó.

3

Nếu tệp csv của bạn không đủ lớn (để phát nổ bộ nhớ), hãy đọc tất cả vào bộ nhớ và đóng tệp trước khi mở tệp đó ở chế độ ghi.

Hoặc bạn nên cân nhắc việc ghi vào một tệp mới chứ không phải cùng một tệp.

6

Bạn không thể mở tệp ở cả hai chế độ đọcghi cùng một lúc.

Mã của bạn có thể được sửa đổi như sau: -

# Do the reading 
file1 = open(file.csv, 'rb') 
reader = csv.reader(file1) 
new_rows_list = [] 
for row in reader: 
    if row[2] == 'Test': 
     new_row = [row[0], row[1], 'Somevalue'] 
     new_rows_list.append(new_row) 
file1.close() # <---IMPORTANT 

# Do the writing 
file2 = open(file.csv, 'wb') 
writer = csv.writer(file2) 
writer.writerows(new_rows_list) 
file2.close() 

Như Jason chỉ ra, nếu CSV của bạn là quá lớn đối với trí nhớ của bạn, sau đó bạn sẽ cần phải viết thư cho một tên tập tin khác nhau và sau đó đổi tên nó . Điều này có thể sẽ chậm hơn một chút.

0

Không thể mở cùng một tệp ở hai chế độ khác nhau trong python.Bạn phải giải phóng một trong các tệp con trỏ với file_name.close() trước khi mở tệp ở chế độ khác!

Các vấn đề liên quan