Ошибка с 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
Другие вопросы по тегам