簡體   English   中英

如何使用Python csv模塊讀取包含不同分隔符的文件?

[英]How to read in a file with a mixture of different delimiters using Python csv module?

輸入:

A    B    C
D    E    F

此文件不是以制表符分隔的,有些條目以空格分隔,看起來像是制表符分隔的(這很煩人)。 我嘗試使用csv模塊使用規范制表符分隔選項讀取文件,希望它不介意一些空格(不用說,我的輸出出現了這個代碼的拙劣):

with open('file.txt') as f:
    input = csv.reader(f, delimiter='\t')
    for row in input:
        print row

然后我嘗試用csv.reader('\\t'.join(f.split()))替換第二行,嘗試利用string.whitespace中的Python中刪除空格,但我的錯誤是: AttributeError: 'file' object has no attribute 'split'

我也嘗試過檢查我可以導入CSV文件並自動推斷分隔符嗎? 但是這里OP導入了以分號分隔或逗號分隔的文件,但不是一個隨機混合使用兩種分隔符的文件。

想知道csv模塊是否可以處理帶有各種分隔符的文件中的讀取,或者我是否應該嘗試不同的方法(例如,不使用csv模塊)?

我希望有一種方法可以讀取帶有分隔符混合的文件,並自動將此文件轉換為制表符分隔文件。

只需使用.split():

csv='''\
A\tB\tC
D    E    F
'''

data=[]
for line in csv.splitlines():
    data.append(line.split())

print data 
# [['A', 'B', 'C'], ['D', 'E', 'F']]

或者,更簡潔:

>>> [line.split() for line in csv.splitlines()]  
[['A', 'B', 'C'], ['D', 'E', 'F']]

對於文件,例如:

with open(fn, 'r') as fin:
    data=[line.split() for line in fin]

它的工作原理是因為str.split()將拆分數據元素之間的所有空格,即使有超過1個空白字符或混合:

>>> '1\t\t\t2     3\t  \t  \t4'.split()
['1', '2', '3', '4']

為什么不只是滾動自己的拆分器而不是CSV模塊?

delimeters = [',', ' ', '\t']

unique = '[**This is a unique delimeter**]'

with open(fileName) as f:
    for l in f: 
        for d in delimeters: l = unique.join(l.split(d))
        row = l.split(unique)

.split()是一個簡單而好的解決方案,適用於“連續,任意混合的制表符和空格作為一個分隔符”的情況; 但是,當帶有空白的值(由引號標記括起)出現時,這不起作用。

首先,我們可以用一個空白' '替換文本文件中的每個選項卡; 這可以將情況簡化為“連續,任意數量的空白作為一個分隔符”。
在文件上替換模式有一個很好的例子: https//www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch04s04.html
注1:不要用'' (空字符串)替換,因為可能有一個分隔符包含ONLY標簽。
注意2:當您在引號旁邊的值中包含制表符( / t )時,此方法不起作用。

然后我們可以使用Python的csv模塊,使用分隔符作為' ' (一個空白),並使用skipinitialspace=True來忽略連續的空白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM