Справка Python, читая файл CSV, переставший работать из-за окончаний строки

Я пытаюсь создать этот сценарий, который проверит, что название главного компьютера затем ищет основной список значение для возвращения соответствующего значения в файле 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

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

Заранее спасибо за Вашу справку, Aaron


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

Traceback (новый вызов в последний раз):
Файл "update.py", строка 3, в для строки в csv. DictReader (открытый (fname), разделитель = '\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.reader.next () _csv. Ошибка: символ новой строки, замеченный в неупомянутом поле - необходимо ли открыть файл в режиме универсальной новой строки?

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

import csv
fname = "masterlist.txt"
for row in csv.DictReader(open(fname), delimiter='\t'):
  print(row)
8
задан smci 15 June 2016 в 21:06
поделиться

3 ответа

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

>>> 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'}

Но поскольку вы хотите связать Имя с UID :

>>> reader = csv.reader(open("masterlist.txt"), delimiter='\t')
>>> _ = next(reader)                                  # just discarding header
>>> d = dict(reader)
>>> d['Carmen-Jackson.local']
'carmenj'
2
ответ дан 5 December 2019 в 06:52
поделиться

Я бы наполнил словарь следующим образом:

>>> 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
ответ дан 5 December 2019 в 06:52
поделиться

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

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

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

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

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

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

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

20
ответ дан 5 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: