我正在尝试创建此脚本以检查计算机主机名,然后在主列表中搜索该值以返回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
现在,它只是设置为打印主列表。我不确定列表是否需要解析并放入字典或什么。我真的需要弄清楚如何在第一个字段中搜索主机名,然后在第二列中返回该字段。
先谢谢你的帮助, 亚伦
UPDATE :我从masterlist.txt中删除了第194行和最后一行,然后重新运行了该脚本。结果如下:
追踪(最近的呼叫最后):
文件“update.py”,第3行,in 对于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)
答案 0 :(得分:20)
第194行中出现两次“\ xD5”,最后一行与问题无关。
问题似乎是Python 2.6 csv模块中的错误,误导性错误消息或不正确/模糊的文档。
在文件中,这些行在Classic Mac传统中以'\ x0D'('\ r')终止。最后一行没有终止,但这与问题无关。
docs for csv.reader说“如果csvfile是一个文件对象,它必须在平台上以'b'标志打开,这会产生影响。”众所周知,它确实在Windows上有所作为。但是,使用'rb'或'r'打开文件在这种情况下没有任何区别 - 仍然是相同的错误消息。
docs for csv.Dialect.lineterminator说“用于终止作者产生的行的字符串。默认为'\ r \ n'。注意:读者硬编码识别'\ r'或'\ n'作为行尾,并忽略了行终止。这种行为将来可能会改变。“它似乎将'\ r'识别为新行但不是行尾/结束字段。
错误消息“_csv.Error:在未加引号的字段中看到的新行字符 - 您是否需要以通用换行模式打开文件?”令人困惑;它被认为是'\ r'作为一个新线,但它不是将新线视为一个终点线(因而隐含在场外)。
似乎需要以“rU”模式打开文件才能使其“正常工作”。不太明显为什么在通用换行模式中识别的'\ r'更好。
答案 1 :(得分:2)
要对读者进行迭代:
>>> 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'
答案 2 :(得分:2)
我会填充这样的字典:
>>> 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'