Почему Python 2.7.3 считает, что мой документ.csv находится в одной строке?

Я новичок в программировании, и я столкнулся с проблемой в некоторых моих курсовых работах, которую я не могу понять. Рассмотрим воображаемый файл с именем example.csv со следующим содержимым.

Key1,Value1
Key2,Value2
Key3,Value3
...

Если я запускаю следующий код, он печатает каждую строку в файле, за которой следует одна звездочка в последней строке. Я ожидал, что он напечатает каждую строку, разделенную звездочкой.

infile = open("example.csv", "r")
for line in infile:
    print line.strip()
    print '*'
    #row_elements = line.split(",")
    #print row_elements

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

['Key1', 'Value1\rKey2', 'Value2\rKey3'...

Вместо этого, передавая "\r" методу.split(), вывод немного улучшается.

['Key1,Value1', 'Key2,Value2'...

Я до сих пор не понимаю, почему Python думает, что весь файл в первую очередь находится на одной строке. У кого-нибудь есть понимание этого?

3 ответа

Решение

Ваш файл использует \r в качестве разделителей строк (также называемых соглашением о новой строке "CR" или "Classic Mac"). Питона open не имеет дело с этим по умолчанию.

Вы можете использовать режим "универсальных новых строк" ('rU' режим в open), чтобы открыть файл правильно.

(Обратите внимание, что некоторые текстовые редакторы Mac по-прежнему используют \r как терминатор линии, хотя, к счастью, сейчас они встречаются гораздо реже, чем несколько лет назад.)

Ваш входной файл плохо отформатирован. В Linux строки разделяются '\n', В Windows строки разделяются '\r\n', но код в библиотеке времени выполнения делает '\r' исчезают.

В вашем файле строки разделены '\r', что не является стандартом ни в одной современной операционной системе. Возможно, программа, которая создала файл, имеет некоторые недостатки.

Если вы имеете дело с CSV, вы должны использовать csv Модуль, он заботится о большей части дерьма, связанного с обработкой CSV ввода / вывода.

import csv
with open("example.csv", "rb") as infile:
    reader = csv.reader(infile)
    for row in reader:
        print row # a list of items in your file

with Слушание операторов автоматически закроет файл для вас, когда вы выйдете из блока операторов.

Другие вопросы по тегам