在python脚本中,我需要检测不同csv文件的endline终结符。这些终端终结符可以是:' \ r' (mac),' \ r \ n' (窗口),' \ n' (UNIX)。
我尝试过:
dialecto = csv.Sniffer().sniff(csvfile.read(2048), delimiters=",;")
dialecto.lineterminator
但它没有用。
我怎么能这样做?
修改
基于abarnert响应:
def getLineterminator(file):
with open(file, 'rU') as csvfile:
csvfile.next()
return csvfile.newlines
答案 0 :(得分:1)
您不能使用csv
模块以这种方式自动检测线路终结器。您正在使用的Sniffer
旨在猜测CSV方言,以供csv.Reader
使用。但是,正如the docs say,csv.Reader
实际上忽略了lineterminator
并且可以互换地处理行结尾,因此Sniffer
没有任何理由设置它。
但实际上,带有XXX行终止符的CSV文件只是一个带有XXX行终止符的文本文件。这是CSV无关紧要的事实。在文本模式下只需open
文件,从中读取一行,然后检查其newlines
属性:
next(file)
file.newlines
在Python 3中,只要您以文本模式打开文件(不要在模式中使用'b'
),这将有效。在Python 2.x中,您可能需要指定通用换行模式(不要使用'b'
,并且执行使用'U'
)。如果你正在为两个版本编写代码,你可以使用通用换行模式,它只会在3.x中被忽略 - 但除非你需要它,否则不要这样做,因为它从3.6开始被弃用并且可能成为一个有一天错误。