Python справка чтения файла CSV сбой из-за окончания строки - PullRequest
8 голосов
/ 28 мая 2010

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

masterlist.txt  (tab delimited)
Name                 UID
Bob-Smith.local      bobs
Carmen-Jackson.local carmenj
David-Kathman.local  davidk
Jenn-Roberts.local   jennr

Вот сценарий, который я создал до сих пор

#GET CLIENT HOST NAME
import socket
host = socket.gethostname()
print host

#IMPORT MASTER DATA
import csv, sys
filename = "masterlist.txt"
reader = csv.reader(open(filename, "rU"))

#PRINT MASTER DATA
for row in reader:
  print row

#SEARCH ON HOSTNAME AND RETURN UID



#REPLACE VALUE IN FILE WITH UID
#import fileinput
#for line in fileinput.FileInput("filetoreplace",inplace=1):
#   line = line.replace("replacethistext","UID")
#   print line

Прямо сейчас он просто настроен на печать основного списка. Я не уверен, что список нужно проанализировать и поместить в словарь или что-то еще. Мне действительно нужно выяснить, как искать в первом поле имя хоста, а затем вернуть поле во втором столбце.

Заранее спасибо за помощь, Аарон


ОБНОВЛЕНИЕ : я удалил строку 194 и последнюю строку из masterlist.txt, а затем повторно запустил скрипт. Результаты были следующие:

Traceback (последний последний вызов):
Файл "update.py", строка 3, в для строки в csv.DictReader (open (fname), delimiter = '\ t'): файл "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", строка 103, в следующем Файл self.fieldnames "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", строка 90, в именах полей self._fieldnames = self.reader.next () _csv.Error: символ новой строки, видимый в поле без кавычек - вам нужно открыть файл в режиме универсальной новой строки?

Текущий используемый скрипт ...

import csv
fname = "masterlist.txt"
for row in csv.DictReader(open(fname), delimiter='\t'):
  print(row)

Ответы [ 3 ]

20 голосов
/ 29 мая 2010

Два вхождения '\ xD5' в строке 194 и последней строке не имеют ничего общего с проблемой.

Похоже, что проблема связана с ошибкой, вводящим в заблуждение сообщением об ошибке или неверной / расплывчатой ​​документацией в модуле CSV Python 2.6.

В файле строки заканчиваются символом '\ x0D' aka '\ r' в традиции классического Mac. Последняя строка не заканчивается, но это не имеет отношения к проблеме.

Документы для csv.reader говорят: «Если csvfile является файловым объектом, он должен открываться с флагом« b »на платформах, где это имеет значение». Широко известно, что это действительно имеет значение для Windows. Однако открытие файла с помощью 'rb' или 'r' в этом случае не имеет значения - все равно то же сообщение об ошибке.

Документы для csv.Dialect.lineterminator говорят "Строка, используемая для завершения строк, созданных записывающим устройством. По умолчанию используется значение \\ r \ n". Примечание. либо '\ r' или '\ n' в качестве конца строки, и игнорирует переводчик строки. Это поведение может измениться в будущем. " Кажется, он распознает '\ r' как новую строку, но не как конец строки / конец поля.

Сообщение об ошибке «_csv.Error: символ новой строки, видимый в поле без кавычек - вам нужно открыть файл в режиме универсальной новой строки?» сбивает с толку; он распознается как '\ r' как новая строка, но он не рассматривает новую строку как конец строки (и, следовательно, неявно означает конец поля).

Представляется необходимым открыть файл в режиме «rU», чтобы он «заработал». Неясно, почему тот же самый '\ r', распознаваемый в режиме универсальной новой строки, лучше.

2 голосов
/ 29 мая 2010

Я бы заполнил словарь так:

>>> import csv
>>> name_to_UID = {}
>>> for row in csv.DictReader(open(filename, 'rU'), delimiter='\t'):
    name_to_UID[row['Name']] = row['UID']
>>> name_to_UID['Carmen-Jackson.local']
'carmenj'
2 голосов
/ 28 мая 2010

Чтобы перебрать читателя, вы должны сделать:

>>> import csv
>>> for row in csv.DictReader(open(fname), delimiter='\t'):
    print(row)


{'Name': 'Bob-Smith.local', 'UID': 'bobs'}
{'Name': 'Carmen-Jackson.local', 'UID': 'carmenj'}
{'Name': 'David-Kathman.local', 'UID': 'davidk'}
{'Name': 'Jenn-Roberts.local', 'UID': 'jennr'}

Но так как вы хотите связать Name с UID:

>>> reader = csv.reader(open("masterlist.txt"), delimiter='\t')
>>> _ = next(reader)                                  # just discarding header
>>> d = dict(reader)
>>> d['Carmen-Jackson.local']
'carmenj'
...