2017-02-21 67 views
0

我有一個包含一些換行數據的tsv文件。如何用python解析tsv文件?

111 222 333 "aaa" 
444 555 666 "bb 
b" 

在第三行這裏bbb在第二行上一個新行字符,因此它們是一個數據:

第一行的第四個值:

aaa 

第四第二行值:

bb 
b 

如果我使用Ctrl + C和Ctrl + V粘貼到一個excel文件,它運作良好。但如果我想使用python導入文件,如何解析?

我曾嘗試:

lines = [line.rstrip() for line in open(file.tsv)] 
for i in range(len(lines)): 
    value = re.split(r'\t', lines[i])) 

但結果並不好:

enter image description here

我想:

enter image description here

+1

不知道你的這個意思:「在這裏B上的第三行是BB的換行符」 – Bemmu

回答

1

只需使用csv模塊。它知道CSV文件中所有可能的角落案例,例如引用字段中的新行。

with open("file.tsv") as fd: 
    rd = csv.reader(fd, delimiter="\t", quotechar='"') 
    for row in rd: 
     print(row) 

能正確輸出:

['111', '222', '333', 'aaa'] 
['444', '555', '666', 'bb\nb'] 
+0

謝謝。這是簡單和最好的解決方案。 –

0

換行符,當內容中(單元格).tsv /。 csv通常用引號引起來。否則,標準分析可能會將其混淆爲下一行的開始。在你的情況下,行

for line in open(file.tsv) 

自動使用換行符作爲分隔符。

如果您確定文件只有4列,您可以簡單地閱讀整個文本,根據選項卡拆分它,然後一次提取4個項目。

# read the entire text and split it based on tab 
old_data = open("file.tsv").read().split('\t') 

# Now group them 4 at a time 
# This simple list comprehension creates a for loop with step size = num. of columns 
# It then creates sublists of size 4 (num. columns) and puts it into the new list 
new_data = [old_data[i:i+4] for i in range(0, len(old_data), 4)] 

理想情況下,您應該關閉可能引用換行符的內容。

+0

非常感謝你。是的,真實的數據是雙引號。我編輯了這個話題。我會讀你的方法。 –