Ошибка с urlopen: символ новой строки в поле без кавычек
Я использую urllib.urlopen с Python 2.7 для чтения файлов CSV, расположенных на внешнем веб-сервере:
# Try & Except statements removed for clarity
import urllib
import csv
url = ...
csv_file = urllib.urlopen(url)
for row in csv.reader(csv_file):
do_something()
Все 100+ файлов могут быть прочитаны нормально, кроме одного, который был недавно обновлен и который возвращает:
Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
Файл доступен здесь. Согласно моему текстовому редактору, его режим - Mac (CR), в отличие от Windows (CRLF) для других файлов.
Я обнаружил, что на основе этого потока python urlopen будет корректно обрабатывать все форматы новых строк. Поэтому проблема, скорее всего, возникнет откуда-то еще. Я понятия не имею, хотя. Файл открывается нормально со всеми моими текстовыми редакторами и моими редакторами электронных таблиц.
У кого-нибудь есть идеи, как диагностировать проблему?
* РЕДАКТИРОВАТЬ *
Создатель файла сообщил мне по электронной почте, что я был не единственным, кто столкнулся с такими проблемами. Поэтому он решил сделать это снова. Код выше теперь снова работает нормально. К сожалению, использование нового файла также означает, что проблема больше не может быть воспроизведена, и решения протестированы должным образом.
Прежде чем закрыть вопрос, я хочу поблагодарить всех укладчиков, которые посвятили некоторое время тому, чтобы найти решение и опубликовать его здесь.
3 ответа
Это может быть поврежденный файл.csv? В противном случае этот код работает отлично.
#!/usr/bin/python
import urllib
import csv
url = "http://www.football-data.co.uk/mmz4281/1213/I1.csv"
csv_file = urllib.urlopen(url)
for row in csv.reader(csv_file):
print row
Кредиты jfs для файла.csv.
Хотя, возможно, вы захотите поделиться с нами конкретным файлом.csv? Таким образом, мы можем попытаться воссоздать ошибку.
Следующий код выполняется без ошибок:
#!/usr/bin/env python
import csv
import urllib2
r = urllib2.urlopen('http://www.football-data.co.uk/mmz4281/1213/I1.csv')
for row in csv.reader(r):
print row
У меня была такая же проблема с загруженным CSV.
Я знаю, что исправление было бы использовать open с 'rU'. Но я бы предпочел не сохранять файл на диск, а просто открыть его обратно в переменную. Это кажется ненужным.
file = open(filepath,'rU')
mydata = csv.reader(file)
Так что, если у кого-то есть лучшее решение, это было бы неплохо. Ссылки Stackru, которые дали мне это далеко:
Символ новой строки CSV, видимый в поле без кавычек
Откройте файл в режиме универсальной новой строки с помощью модуля CSV Django.
Я нашел то, что на самом деле хотел с помощью stringIO, или cStringIO, или io:
Используя Python, как мне читать / записывать данные в память, как если бы я работал с файлом?
Я закончил тем, что получил работу,
import csv
import urllib2
import io
# warning its a 20MB csv
url = 'http://poweredgec.com/latest_poweredge-11g.csv'
urlRead = urllib2.urlopen(url).read()
ramFile = io.open(urlRead, mode='w')
openRamFile = open(ramFile, 'rU')
csvCurrent = csv.reader(openRamFile)
csvTuple = map(tuple, csvCurrent)
print csvTuple