2016-10-24 3 views
0

데이터 묶음이있는 CSV가 있고 특정 행과 열의 데이터를 변경해야합니다. 내가 파일을 통해 읽을 수있는 행을 변경하려면, 내가 변경해야 할 데이터를 변경할 수 있지만 메모리에 변경 내용을 커밋하고 CSV 올바르게 다시 쓰기 방법을 알아낼 수 없습니다.Python 2.7 - CSV의 특정 행, 열 편집

다음 코드는 실패하지 않지만 올바르지 않습니다. 변경 한 내용을 열 (col)에 적용하는 대신 변경하려는 행만 복제합니다. 데이터는 변경되지 않았으므로 변경 사항을 원했던 행이 중복되었습니다.

import csv 
import re 
from tempfile import NamedTemporaryFile 
import shutil 

csvName = raw_input("Enter the filename: ") 
tempfile = NamedTemporaryFile(delete=False) 
newSize = 0 
newArea = 0 

with open(csvName, 'rb') as readCSV, tempfile: 
    reader = csv.reader(readCSV) 
    writer = csv.writer(tempfile) 
    for row in reader: 
     for col in row: 
      if col.startswith('Connection:'): 
       print col 
      if col.startswith('Size:'): 
       print "Current", col 
       newSize = raw_input("Enter new size: ") 
       newArea = int(newSize)*int(newSize) 
       col = re.sub('[0-9]+', newSize, col) 
       writer.writerow(row) 
      if col.startswith('Area:'): 
       col = re.sub('[0-9]+', str(newArea), col) 
       writer.writerow(row) 
     writer.writerow(row) 

shutil.move(tempfile.name, csvName) 

변경해야 한 비트의 데이터의 예는 다음과 같습니다

연결 : D14Conn 유형 : B2B 크기 : 140 기하 : 광장 지역 : 19,600

내 위의 코드는 단순히 새 행을이 데이터에 복제 할 것이고 col에 대한 변경 사항은 커밋되지 않습니다. 아래와 같이

연결 : D14Conn 유형 : B2B 크기 : 140 크기 : 140 기하 : 광장 지역 : 19,600 지역 : 19,600

답변

0

귀하의 row은 변경되지 않습니다. 새 열 값을 사용하여 new_row을 만들어야합니다. writer.writerow(new_row)

1

col에 할당하면 행의 col 값 복사본에 할당됩니다. row을 반복 할 때 변경하려는 값의 인덱스를 계속 참조하고 해당 인덱스에서 row을 업데이트하면 writer.writerow(row)을 호출 할 때 실제로 변경된 개체로 쓰거나 new_row을 만들 수 있습니다. 원하는 열. 복제본의 경우 if 블록에서 writer.writerow(row) 호출을 제거하면 중복됩니다.

+0

나는 이것이 내가해야 할 필요가 있다고 생각했다. 그래서, 반복 한 행 번호와 그 행 번호에서 반복 한 행 번호를 추적하고 그 행/열의 값을 변경해야합니다. –

+0

'reader'는 반복 가능한 객체이므로 행 번호를 추적하는 것이 반드시 도움이되지는 않지만 각'row'는 단순히 값의 배열이 될 필요가 없습니다. 따라서보고있는 행의 세 번째 열을 업데이트해야한다면'row [2] = ___'이라고 말하고'writer.writerow (row)'는 업데이트 –

+0

을 반영합니다. 나는 처형에 문제가있다. csvReader가 csv를 Row : Column 형식으로 추적하는 것은 아닙니다. 반복을 추적하면서 다음 코드를 시도하면 열 수를 참조하려는 시도로 인해 "범위를 벗어난리스트 인덱스"오류로 끝납니다 : –