2014-09-25 2 views
2

Найти это действительно странно, по какой-то причине '\ n' добавляется к последней записи в моем списке, когда я разделяю строку из CSV-файла.Python: n добавлен после разбиения файла csv

Script

f = open("temp.csv") 
    lines = f.readlines() 
    headings = lines[0] 
    global heading_list 
    heading_list = headings.split(";") 
    print headings 

Я распечатаны как раз HEADINGS себя, и это не имеет «\ п», когда в конце, это, кажется, только тогда, когда она разделена на полу двоеточие.

.csv файл

timestamp;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%idle 
10-20-39;6.53;0.00;4.02;0.00;0.00;0.00;0.00;0.00;89.45 
10-20-41;0.50;0.00;1.51;0.00;0.00;0.00;0.00;0.00;97.99 
10-20-43;1.98;0.00;1.98;5.45;0.00;0.50;0.00;0.00;90.10 
10-20-45;0.50;0.00;1.51;0.00;0.00;0.00;0.00;0.00;97.99 
10-20-47;0.50;0.00;1.50;0.00;0.00;0.00;0.00;0.00;98.00 
10-20-49;0.50;0.00;1.01;3.02;0.00;0.00;0.00;0.00;95.48 

Выход из сценария

Script Output

+0

Если вы используете файл 'CSV', почему бы вам не попробовать« CSV-модуль »? – Harpal

+0

В конце вашей переменной 'headings' содержится' \ n' (или '\ r \ n'), поэтому она формирует первую ** строку ** файла :) В зависимости от метода, который вы используете для печати переменная будет показана явно или просто перейти к следующей строке на выходе. –

ответ

2

Когда вы читаете строку в Python, то символ конца строки не удаляется. Вы должны сделать это вручную, например, с line.rstrip("\r\n"). Это не проблема с split, но с readlines.

+1

В частности, 'headings.strip()' решит проблему. –

+1

@ Vincent Конечно, но я предпочитаю rstrip ("\ r \ n"), что влияет только на конец строк. Возможно, безвреден CSV, но в любом случае чище. – 2014-09-25 10:58:56

+0

Я просто попробовал rstrip и разделился на заголовки, оба не работали, \ n все еще находится в конце '% idle'.Когда я запускаю свой скрипт, вывод такой же, как на картинке. –

1

Короткий ответ - используйте модуль csv. Смотри ниже.

Новый символ строки присутствует в данных, которые были прочитаны из файла. readlines() не удаляет его, а на самом деле вы увидите, что символ новой строки является присутствует в headings:

>>> headings = lines[0] 
>>> headings 
'timestamp;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%idle\n' 

Лучший способ заключается в использовании splitlines() на данных, считанных из файла. Это будет удалить новые линии, независимо от типа ('\n', '\r\n', '\r'):

>>> with open("temp.csv") as f: 
>>>  lines = f.read().splitlines() 
>>>  headings = lines[0] 
>>> headings 
'timestamp;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%idle' 

readlines() терпит неудачу для Mac переноса строк ('\r'), так что вы должны открыть файл с universal newline support, указав 'rU' в качестве режима :

with open('temp.csv', 'rU') as f: 
    ... 

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

with open('temp.csv', 'rU') as f: 
    heading_list = next(f).rstrip().split(';') # headings on the first line 
    for line in f: 
     process_data_row(line.rstrip().split(';')) 

И, наконец, настоящий ответ. Вы можете избежать всех ошибок выше, используя модуль csv:

import csv 

with open('temp.csv', 'rU') as csv_file: # NB. 'rU' is important for handling mac newlines 
    csv_data = csv.reader(csv_file, delimiter=';') 
    heading_list = next(csv_data) 
    for row in csv_data: 
     process_data_row(row) 
Смежные вопросы