2009-06-19 7 views
7

[이 이미 응답 한에서 다른 질문이 있습니다 How to replace a column using Python’s built-in .csv writer module?] 나는 발견을하고 거대한에서 (URL 중 하나를 열 특정) 교체해야파이썬에 내장 된 .CSV 모듈

Excel .csv 파일. 필자는 스크립팅 언어를 가르치려는 초기 단계에 있기 때문에 파이썬으로이 솔루션을 구현하려고합니다.

항목의 내용을 변경 한 후 .csv 파일에 다시 쓰려고 할 때 문제가 있습니다. 작가를 사용하는 방법에 대해서는 official csv module documentation을 읽었지만이 사례를 다루는 예제는 없습니다. 특히, 한 루프에서 읽기, 바꾸기 및 쓰기 작업을 수행하려고합니다. 그러나 for 루프의 인수와 writer.writerow()의 매개 변수 모두에서 동일한 '행'참조를 사용할 수 없습니다. 따라서 for 루프를 변경 한 후에 파일에 어떻게 다시 써야합니까?

편집 :() 함수 나는 열려면 "RB"와 "WB"를 추가 : 나는 여전히 같은 결과

편집 # 2, S. 로트와 지미의 제안을 구현 S. 로트의 제안에 따라

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) 

편집 : 참고로,이 인터프리터에서 새로운 전체 역 추적은 다음과 같습니다

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?) 

답변

10

동일한 파일을 읽고 쓸 수 없습니다.

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

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

모든 파일 조작에 대한 일반적인 접근 방식은 원본 파일의 수정 된 COPY를 만드는 것입니다. 파일을 제자리에 업데이트하지 마십시오. 그것은 단지 나쁜 계획 일뿐입니다. 라인

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

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

"WB"절대적으로 요구된다 "RB"과에서


편집

. 당신이 그들을 무시할 때마다, 당신은 잘못된 형식으로 읽기위한 파일을 엽니 다.

.CSV 파일을 읽으려면 "rb"를 사용해야합니다. Python 2.x에는 선택의 여지가 없습니다. Python 3.x에서는이를 생략 할 수 있지만 "r"을 명시 적으로 사용하면 명확하게 알 수 있습니다.

.CSV 파일을 작성하려면 "wb"를 사용해야합니다. Python 2.x에는 선택의 여지가 없습니다. Python 3.x에서는 "w"를 사용해야합니다.


편집

당신이 Python3를 사용하고 나타납니다. "b"를 "rb"와 "wb"에서 삭제해야합니다.

이 읽기 ​​: http://docs.python.org/3.0/library/functions.html#open

+0

그래, 나는 그 문제도 처리했다. 우리가 점점 더 가까워지고있는 것 같습니다. 추적이 짧아졌습니다. :) – ignorantslut

+0

파일에 다시 쓰려고 시도하기 전에 생각했습니다. (예 : 내가 오른쪽 열을 찾는 작업을하고있을 때. .csv) 스크립트는 rb없이 정상적으로 작동했습니다. – ignorantslut

+2

""rb "와"wb "는 절대적으로 필요합니다.": 파이썬 3에서는 아닙니다. newline = ''으로 open()을 호출해야합니다. – Miles

2

문제는 당신이 읽고있는 파일에 쓰려고한다는 것입니다. 다른 파일에 쓰고 원본을 삭제 한 후에 이름을 바꿉니다.

4

열기 CSV 파일을 바이너리 그냥 잘못 때문이다. 당신은

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

당신은 바이너리 모드를 열기 때문에

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

가 제공되는 오류를 열 필요가 있도록 CSV는 일반 텍스트 파일입니다. 내가 파이썬과 엑셀의 CSV의를 열 때

, 나는 같은 것을 사용 :

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 

그리고 내가 파이썬 2.6으로 이런 짓을하지만 나는, 약 10MB 각 CSV 파일이 아니 개방되었다 (오히려 빠른 일 3.0 버전).

파이썬에서 엑셀 CSV 파일 작업을위한 작업 모듈이 거의 없습니다 - pyExcelerator이 그 중 하나입니다.

+1

(1) 파일 열기에 대한 조언이 잘못되었습니다. Python 2.x에서는 적절하게 "rb"또는 "wb"를 사용하십시오. 읽기를위한 파이썬 3.x의 경우, newline = '' (2)을 지정하십시오. "파이썬에서 CSV 파일을 엑셀로 작업하기위한 작업 모듈이 거의 없습니다." csv 모듈 하나가 있습니다. pyExcelerator의 관련성은 무엇입니까 ?? –

+0

John, 저는 100 % 확실합니다. 파이썬 2.6에서 CSV 파일로 작업 할 때, 바이너리 모드가 아닌 텍스트로 열었습니다. 나는 파이썬 2.6.2에서 하나 열려고 시도했다. 그것은 매력처럼 작동했다. 영어가 제 2 언어이므로 내 게시물/의견은 일반적으로 술취한 십대가 쓴 것처럼 들립니다. 내가 pyExcelerator에서 의미했던 것은 csv 파일 작업을 위해 특별히 설계된 모듈이 거의 없다는 것입니다. 필자는이 모듈을 표준 배포본에 포함 시켰습니다. 힘내 친구 야. – zeroDivisible

+1

(1) 데이터에 개행 문자가 포함되어 있으면 텍스트 모드의 2.x 열기가 제대로 작동하지 않습니다. 매뉴얼에 바이너리 모드로 열린다. 그냥 해! (2) pyExcelerator는 csv 파일을 읽거나 쓰지 않습니다. 다시 묻습니다 : pyExcelerator의 관련성은 무엇입니까 ??? –