2009-06-19 23 views
7

[Xin lưu ý rằng đây là một câu hỏi khác nhau từ đã trả lời How to replace a column using Python’s built-in .csv writer module?]Viết với Python tích hợp trong mô-đun .csv

tôi cần phải làm một tìm và thay thế (cụ thể cho một cột URL) trong một khổng lồ Tệp .csv của Excel. Kể từ khi tôi đang ở giai đoạn đầu của việc cố gắng để dạy cho mình một ngôn ngữ kịch bản, tôi figured tôi muốn cố gắng thực hiện các giải pháp trong python.

Tôi gặp sự cố khi cố gắng ghi lại tệp .csv sau khi thực hiện thay đổi đối với nội dung của mục nhập. Tôi đã đọc official csv module documentation về cách sử dụng tác giả, nhưng không có ví dụ nào đề cập đến trường hợp này. Cụ thể, tôi đang cố gắng để có được các hoạt động đọc, thay thế và viết hoàn thành trong một vòng lặp. Tuy nhiên, người ta không thể sử dụng cùng một tham chiếu 'hàng' trong cả đối số của vòng lặp for và làm tham số cho writer.writerow(). Vì vậy, một khi tôi đã thực hiện thay đổi trong vòng lặp for, làm thế nào tôi nên viết lại cho tập tin?

chỉnh sửa: tôi thực hiện những gợi ý từ S. Lott và Jimmy, vẫn cùng một kết quả

chỉnh sửa # 2: tôi thêm "rb" và "wb" vào open() chức năng, theo đề nghị S. Lott của

import csv 

#filename = 'C:/Documents and Settings/username/My Documents/PALTemplateData.xls' 

csvfile = open("PALTemplateData.csv","rb") 
csvout = open("PALTemplateDataOUT.csv","wb") 
reader = csv.reader(csvfile) 
writer = csv.writer(csvout) 

changed = 0; 

for row in reader: 
    row[-1] = row[-1].replace('/?', '?') 
    writer.writerow(row)     #this is the line that's causing issues 
    changed=changed+1 

print('Total URLs changed:', changed) 

chỉnh sửa: Đối với các bạn tham khảo, đây là mới traceback đầy đủ từ người phiên dịch:

Traceback (most recent call last): 
    File "C:\Documents and Settings\g41092\My Documents\palScript.py", line 13, in <module> 
    for row in reader: 
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) 

Trả lời

10

Bạn không thể đọc và ghi cùng một tệp.

source = open("PALTemplateData.csv","rb") 
reader = csv.reader(source , dialect) 

target = open("AnotherFile.csv","wb") 
writer = csv.writer(target , dialect) 

Cách tiếp cận bình thường để TẤT CẢ thao tác tệp là tạo bản sao COPY đã sửa đổi. Đừng cố cập nhật các tệp tại chỗ. Nó chỉ là một kế hoạch tồi tệ.


Sửa

Trong dòng

source = open("PALTemplateData.csv","rb") 

target = open("AnotherFile.csv","wb") 

Các "rb" và "wb" là hoàn toàn cần thiết. Mỗi khi bạn bỏ qua chúng, bạn mở tệp để đọc ở định dạng sai.

Bạn phải sử dụng "rb" để đọc tệp .CSV. Không có sự lựa chọn nào với Python 2.x. Với Python 3.x, bạn có thể bỏ qua điều này, nhưng sử dụng "r" một cách rõ ràng để làm cho nó rõ ràng.

Bạn phải sử dụng "wb" để ghi tệp .CSV. Không có sự lựa chọn nào với Python 2.x. Với Python 3.x, bạn phải sử dụng "w".


Sửa

Có vẻ bạn đang sử dụng Python3. Bạn sẽ cần phải thả "b" từ "rb" và "wb".

đọc này: http://docs.python.org/3.0/library/functions.html#open

+0

Được rồi, tôi cũng lo vấn đề đó. Có vẻ như chúng ta đang tiến gần hơn ... Traceback trở nên ngắn hơn :) – ignorantslut

+0

Bây giờ tôi nghĩ về nó, tuy nhiên, trước khi tôi cố gắng viết lại tập tin (tức là, khi tôi vẫn đang tìm kiếm cột bên phải trong .csv), tập lệnh hoạt động tốt mà không có rb. – ignorantslut

+2

"Các" rb "và" wb "là hoàn toàn bắt buộc.": Không có trong Python 3. Ở đó, bạn nên gọi open() với newline = ''. – Miles

2

vấn đề là bạn đang cố ghi vào cùng một tệp bạn đang đọc. ghi vào một tập tin khác và sau đó đổi tên nó sau khi xóa bản gốc.

4

file csv mạc như nhị phân chỉ là sai. CSV là các tập tin văn bản bình thường do đó, bạn cần phải mở chúng với

source = open("PALTemplateData.csv","r") 
target = open("AnotherFile.csv","w") 

Các lỗi

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) 

đến vì Bạn đang mở chúng trong chế độ nhị phân.

Khi tôi mở csv của excel với trăn, tôi sử dụng cái gì đó như:

try: # checking if file exists 
    f = csv.reader(open(filepath, "r", encoding="cp1250"), delimiter=";", quotechar='"') 
except IOError: 
    f = [] 

for record in f: 
    # do something with record 

và nó làm việc khá nhanh (Tôi đã mở hai khoảng 10MB mỗi file csv, mặc dù tôi đã làm điều này với python 2.6, không phiên bản 3.0).

Có vài mô đun làm việc để làm việc với tệp csv excel từ trong python - pyExcelerator là một trong số chúng.

+1

(1) Lời khuyên về việc mở tệp là không chính xác. Đối với Python 2.x, sử dụng "rb" hoặc "wb" nếu thích hợp. Đối với Python 3.x để đọc, chỉ định newline = '' (2) Tôi không hiểu "Có vài mô đun làm việc để làm việc với các tệp csv excel từ trong python". Có một, mô-đun csv. Sự liên quan của pyExcelerator là gì ?? –

+0

John, tôi chắc chắn 100%, khi tôi đang làm việc với các tệp csv với python 2.6, tôi đã mở chúng bằng văn bản, không phải ở chế độ nhị phân. Tôi đã mở cố gắng để mở một trong bây giờ trong python 2.6.2 - nó làm việc như một say mê. Tiếng Anh là ngôn ngữ thứ hai của tôi nên các bài viết/bình luận của tôi thường nghe giống như chúng được viết bởi teenanger say xỉn. Ý tôi là với pyExcelerator, là có vài mô-đun được thiết kế đặc biệt để làm việc với các tệp csv - tôi không viết, rằng các mô-đun này được bao gồm trong phân phối chuẩn. Cổ vũ người bạn đời. – zeroDivisible

+1

(1) 2.x mở ở chế độ văn bản sẽ không hoạt động đúng nếu có dòng mới được nhúng trong dữ liệu của bạn. Hướng dẫn nói để mở ở chế độ nhị phân. Cứ làm đi! (2) pyExcelerator không đọc hay viết các tệp csv; một lần nữa tôi hỏi: sự liên quan của pyExcelerator là gì ??? –