Python帮助读取csv文件失败,由于行结束 [英] Python help reading csv file failing due to line-endings

查看:273
本文介绍了Python帮助读取csv文件失败,由于行结束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建这个脚本,将检查计算机主机名,然后搜索主列表中的值,以返回在csv文件中的相应值。然后打开另一个文件,并找到替换。我知道这应该很容易,但没有做过这么多在python之前。这是我到目前为止...

I'm trying to create this script that will check the computer host name then search a master list for the value to return a corresponding value in the csv file. Then open another file and do a find an replace. I know this should be easy but haven't done so much in python before. Here is what I have so far...

masterlist.txt  (tab delimited)
Name                 UID
Bob-Smith.local      bobs
Carmen-Jackson.local carmenj
David-Kathman.local  davidk
Jenn-Roberts.local   jennr

这是到目前为止创建的脚本

Here is the script that I have created thus far

#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

现在,它只是设置为打印主列表。我不知道如果列表需要解析和放入字典或什么。我真的需要找出如何搜索第一个字段的主机名,然后返回第二列中的字段。

Right now, it's just set to print the master list. I'm not sure if the list needs to be parsed and placed into a dictionary or what. I really need to figure out how to search the first field for the hostname and then return the field in the second column.

感谢您的帮助,
Aaron

Thanks in advance for your help, Aaron

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

UPDATE: I removed line 194 and last line from masterlist.txt and then re-ran the script. The results were the following:


跟踪(最近一次调用):

文件update.py第3行,
中csv.DictReader中的行(open(fname),
delimiter ='\t'):File
/System/Library/Frameworks/Python.framework/版本/ 2.6 / lib / python2.6 / csv.py,
第103行,接下来
self.fieldnames文件/System/Library/Frameworks/Python.framework/Versions/2.6/lib/ python2.6 / csv.py,
行90,在fieldnames中
self._fieldnames = self.reader.next()
_csv.Error:在无引号字段中看到的新行字符 - 你需要在通用换行模式下打开
文件吗?

Traceback (most recent call last):
File "update.py", line 3, in for row in csv.DictReader(open(fname), delimiter='\t'): File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", line 103, in next self.fieldnames File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", line 90, in fieldnames self._fieldnames = self.reader.next() _csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

当前使用的脚本是...

The current script being used is...

import csv
fname = "masterlist.txt"
for row in csv.DictReader(open(fname), delimiter='\t'):
  print(row)


推荐答案

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

The two occurrences of '\xD5' in line 194 and the last line have nothing to do with the problem.

在文件中,这些行以'\\'结尾,并且是一个错误或错误的错误信息或不正确/模糊的文档。 \\ x0D'aka'\r'在经典的Mac传统。最后一行没有终止,但这与问题无关。

In the file, the lines are terminated by '\x0D' aka '\r' in the Classic Mac tradition. The last line is not terminated, but that is nothing to do with the problem.

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

The docs for csv.reader say "If csvfile is a file object, it must be opened with the ‘b’ flag on platforms where that makes a difference." It is widely known that it does make a difference on Windows. However opening the file with 'rb' or 'r' makes no difference in this case -- still the same error message.

docs for csv.Dialect.lineterminator 说用于终止编写器生成的行的字符串默认为'\r\\\
'。注意:阅读器是硬编码的,以识别'\r'或'\\\
'作为行尾,并忽略lineterminator。未来。它似乎是将\r识别为换行符,但不是作为行尾/字段结束。

The docs for csv.Dialect.lineterminator say "The string used to terminate lines produced by the writer. It defaults to '\r\n'. Note: The reader is hard-coded to recognise either '\r' or '\n' as end-of-line, and ignores lineterminator. This behavior may change in the future." It appears to be recognising '\r' as new-line but not as end-of-line/end-of-field.

错误消息_csv。错误:在无引号字段中看到新行字符 - 是否需要以通用换行模式打开文件?是混乱;它认为'\r'为一个新行,但它不把新行当作行尾(因此隐含地结束字段)。

The error message "_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?" is confusing; it's recognised '\r' as a new-line, but it's not treating new-line as an end-of line (and thus implicitly end-of-field).

看起来有必要以'rU'模式打开文件以使其工作。不明显为什么在通用换行模式下识别的相同的'\r'是更好的。

It appears necessary to open the file in 'rU' mode to get it to "work". It's not apparent why the same '\r' recognised in universal-newline mode is any better.

这篇关于Python帮助读取csv文件失败,由于行结束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆