Я пытаюсь создать этот сценарий, который проверит, что название главного компьютера затем ищет основной список значение для возвращения соответствующего значения в файле 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)
Чтобы выполнить итерацию по читателю, вы должны сделать:
>>> 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'
Я бы наполнил словарь следующим образом:
>>> 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'
Два вхождения '\ 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', распознаваемый в режиме универсальной новой строки, является лучше.