Python帮助读取csv文件因行结尾而失败

时间:2010-05-28 16:16:29

标签: python csv universal line-endings

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

3 个答案:

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

但是,因为您想将NameUID

相关联
>>> 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'