Что не так с этой программой на Python, работающей на .csv? - PullRequest
1 голос
/ 21 октября 2011

У меня есть текстовый файл со списком строк.

Я хочу найти в файле .csv строки, начинающиеся с этих строк, и поместить их в новый файл .csv.

В этом случае текстовый файл называется «output.txt», исходный файл .csv - «input.csv», а новый файл .csv - «corrected.csv».

Код:

import csv

file = open('output.txt')
while 1:
    line = file.readline()
    writer = csv.writer(open('corrected.csv','wb'), dialect = 'excel')
    for row in csv.reader('input.csv'):
        if not row[0].startswith(line):
            writer.writerow(row)
    writer.close()
    if not line:
        break
    pass

Ошибка:

Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 9, in <module>
writer.writerow(row)
TypeError: 'str' does not support the buffer interface`

Новая ошибка:

Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 12, in <module>
for row in reader:
_csv.Error: line contains NULL byte

Проблема заключалась в том, что файл CSV был сохранен с вкладками вместо запятых, теперь появилась новая проблема:

Traceback (most recent call last):
  File "C:\Python32\Sample Program\csvParser.py", line 13, in <module>
    if row[0] not in lines:
IndexError: list index out of range

Файл CSV содержит более 500 записей данных ... это имеет значение?

Ответы [ 4 ]

6 голосов
/ 21 октября 2011

Если вы посмотрите на документацию , то вот как инициализируется reader:

spamReader = csv.reader(open('eggs.csv', 'r'), ...

Обратите внимание на open('eggs.csv, 'rb').Вы не передаете дескриптор file в строке 9, поэтому str обрабатывается как дескриптор файла и выдает ошибку.

Замените строку 9 следующим:

csv.reader(open('input.csv', 'r', newline = ''))
2 голосов
/ 21 октября 2011

csv.reader не может открыть файл, он принимает объект файла.Лучшее решение было бы так:

import csv

lines = []
with open('output.txt', 'r') as f:
    for line in f.readlines():
        lines.append(line[:-1])

with open('corrected.csv','w') as correct:
    writer = csv.writer(correct, dialect = 'excel')
    with open('input.csv', 'r') as mycsv:
        reader = csv.reader(mycsv)
        for row in reader:
            if row[0] not in lines:
                writer.writerow(row)
0 голосов
/ 26 октября 2011

Ваша последняя проблема:

    if row[0] not in lines:
IndexError: list index out of range

В сообщении об ошибке упоминается индекс списка.
Существует только один индекс списка, о котором можно было бы говорить: 0
Если 0 находится вне диапазона, то len(row) должно быть равно нулю.
Если len(row) равно нулю, соответствующая строка во входном файле должна быть пустой.
Если строка во входном файле пуста, что вы хотите сделать:

(а) вообще игнорировать строку ввода?
(б) поднять (фатальную) ошибку?
(c) записать сообщение об ошибке и продолжить?
(г) что-то еще?

0 голосов
/ 21 октября 2011

Попробуйте это

import csv
import cStringIO

file = open('output.txt') 
while True:     
    line = file.readline()
    buf = cStringIO.StringIO()    
    writer = csv.writer(buf, dialect = 'excel')     
    for row in csv.reader(open('input.csv')):         
        if not row[0].startswith(line):             
            writer.writerow(row)     
    writer.close()
    output = open('corrected.csv', 'wb')
    output.write(buf.getvalue())    
    if not line:         
        break            
    pass

По моему опыту, использование буфера cStringIO для всего процесса и последующий вывод всего буфера в файл происходит быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...