8

我正在尝试创建此脚本,该脚本将检查计算机主机名,然后在主列表中搜索该值以在 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

现在,它只是设置打印主列表。我不确定是否需要解析列表并将其放入字典或什么中。我真的需要弄清楚如何在第一个字段中搜索主机名,然后在第二列中返回该字段。

提前感谢您的帮助,亚伦


更新:我从 masterlist.txt 中删除了第 194 行和最后一行,然后重新运行了脚本。结果如下:

回溯(最近一次调用):
文件“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)
4

3 回答 3

20

第 194 行和最后一行出现的两次 '\xD5' 与问题无关。

该问题似乎是 Python 2.6 csv 模块中的错误、误导性错误消息或不正确/模糊的文档。

在文件中,这些行以 Classic Mac 传统中的 '\x0D' 又名 '\r' 终止。最后一行没有终止,但这与问题无关。

csv.reader的文档说“如果 csvfile 是一个文件对象,则必须在有影响的平台上使用 'b' 标志打开它。” 众所周知,它确实在 Windows 上有所作为。但是,在这种情况下,使用 'rb' 或 'r' 打开文件没有任何区别——仍然是相同的错误消息。

csv.Dialect.lineterminator的文档说“用于终止编写器生成的行的字符串。它默认为 '\r\n'。注意:阅读器被硬编码为识别 '\r' 或 '\n ' 作为行尾,并忽略行终止符。这种行为将来可能会改变。它似乎将 '\r' 识别为换行符,而不是行尾/字段尾。

错误消息“_csv.Error: new-line character seen in unquoted field - 你需要以通用换行模式打开文件吗?” 令人困惑;它被识别为 '\r' 作为换行符,但它没有将换行符视为行尾(因此隐式地结束了字段)。

似乎有必要以“rU”模式打开文件以使其“工作”。不清楚为什么在通用换行模式下识别的相同 '\r' 更好。

于 2010-05-29T05:26:04.937 回答
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'}

但既然你想NameUID

>>> reader = csv.reader(open("masterlist.txt"), delimiter='\t')
>>> _ = next(reader)                                  # just discarding header
>>> d = dict(reader)
>>> d['Carmen-Jackson.local']
'carmenj'
于 2010-05-28T16:23:31.580 回答
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'
于 2010-05-28T20:37:27.970 回答