2012-06-08 3 views
1

Я пытаюсь удалить последнюю строку в формате CSV, но я получаю сообщение об ошибке: _csv.Error: string with NUL byteУдаление последней строки в CSV

Это то, что я до сих пор:

dcsv = open('PnL.csv' , 'a+r+b') 
cWriter = csv.writer(dcsv, delimiter=' ') 
cReader = csv.reader(dcsv) 
for row in cReader: 
    cWriter.writerow(row[:-1]) 

Я не могу понять, почему я получаю ошибку

+0

Возможно, у вас есть файл NUL в вашем файле? – Thomas

+1

Я не думаю, что в любом случае это будет делать то, что вы хотите. 'row [: - 1]' даст вам текущую строку без последнего элемента. Он не даст вам всех строк, кроме последнего. Другими словами, это удаляет последнюю _column_, а не последнюю строку. – octern

+0

Кроме того, какая строка в скрипте дает вам ошибку? – octern

ответ

6

Я только что прочитал в всем файле с readlines(), выскочить последнюю строку, а затем написать, что с модулем CSV

import csv 
f = open("summary.csv", "r+w") 
lines=f.readlines() 
lines=lines[:-1] 

cWriter = csv.writer(f, delimiter=',') 
for line in lines: 
    cWriter.writerow(line) 
+0

Это может сломаться, если в последней строке CSV есть поле с кавычками с новой строкой, так что логическая строка распространяется на несколько строк. – huon

0

Я не уверен, что вы делаете с файлом «a + r + b» и читаете и записываете в тот же файл, поэтому не будете предоставлять полный фрагмент кода, но вот простой способ пропустить любой строки, содержащие в них NUL-байт в файле, который вы читаете, будь то последний, первый или один в середине, который читается.

Хитрость заключается в том, чтобы понять, что документы говорят csvfile аргумент в csv.writer() «может быть любой объект, который поддерживает итератора протокол и возвращает строку каждый раз, когда его метод next() называется.» Это означает, что вы можете заменить файл аргумент в вызове с простой функцией фильтра итератора определяются следующим образом:

def filter_nul_byte_lines(a_file): 
    for line in a_file: 
     if '\x00' not in line: 
      yield line 

и использовать его по аналогии с этим:

dcsv = open('Pnl.csv', 'rb+') 
cReader = csv.reader(filter_nul_byte_lines(dcsv)) 
for row in cReader: 
    print row 

Это вызовет какое-либо строки с байтом NUL в них игнорируются при чтении файла. Кроме того, этот метод работает «на лету», когда считывается каждая строка, поэтому не требуется сразу считывать весь файл в память или предварительно перерабатывать его заранее.

Смежные вопросы