2011-09-20 131 views
6

我有一個文本文件,其中我需要每列,優選爲詞典或列表,其格式爲:蟒讀取文本文件

N  ID REMAIN  VERS   
2 2343333 bana   twelve  
3 3549287 moredp  twelve   
3 9383737 hinsila   twelve   
3 8272655 hinsila   eight   

我曾嘗試:

crs = open("file.txt", "r") 
for columns in (raw.strip().split() for raw in crs): 
    print columns[0] 

結果= '缺貨指數誤差的'

也試過:

crs = csv.reader(open(file.txt", "r"), delimiter=',', quotechar='|', skipinitialspace=True) 
    for row in crs: 
        for columns in row: 
          print columns[3] 

這似乎不是每個「字」讀取每個字符爲一列,

我想獲得的四列,即:

2 
2343333 
bana 
twelve 

成單獨的字典或列表

任何幫助是偉大的,謝謝!

+0

您使用'CRS = csv.reader(打開(file.txt的」, 「R」),分隔符= ' 'quotechar =' |',skipinitialspace = TRUE)',並有一個CSV文件與**空格**作爲分隔符?如果這是你在每次迭代中獲得的變量,而不是'columns [3]',也打印'row [3]'。 – eumiro

+0

如果我將分隔符設置爲「」它會產生相同的輸出,我只是在玩「,」來查看我是否可以進行更改 – Kilizo

+0

您的第一個'for for循環適用於我。沒有'索引錯誤'。 – senderle

回答

8

也能正常工作對我來說:

>>> crs = open("file.txt", "r") 
>>> for columns in (raw.strip().split() for raw in crs): 
...  print columns[0] 
... 
N 
2 
3 
3 
3 

如果要列轉換爲行,請使用zip

>>> crs = open("file.txt", "r") 
>>> rows = (row.strip().split() for row in crs) 
>>> zip(*rows) 
[('N', '2', '3', '3', '3'), 
('ID', '2343333', '3549287', '9383737', '8272655'), 
('REMAIN', 'bana', 'moredp', 'hinsila', 'hinsila'), 
('VERS', 'twelve', 'twelve', 'twelve', 'eight')] 

如果您有空白行,請在使用zip之前對其進行過濾。

>>> crs = open("file.txt", "r") 
>>> rows = (row.strip().split() for row in crs) 
>>> zip(*(row for row in rows if row)) 
[('N', '2', '3', '3', '3'), ('ID', '2343333', '3549287', '9383737', '8272655'), ('REMAIN', 'bana', 'moredp', 'hinsila', 'hinsila'), ('VERS', 'twelve', 'twelve', 'twelve', 'eight')] 
+0

謝謝,你讓我意識到它引起我的索引錯誤的空白行,我想,我將如何擺脫空白行? – Kilizo

+0

@Kilizo,看我的編輯。 – senderle

6
>>> with open("file.txt") as f: 
... c = csv.reader(f, delimiter=' ', skipinitialspace=True) 
... for line in c: 
...  print(line) 
... 
['N', 'ID', 'REMAIN', 'VERS', ''] #that '' is for leading space after columns. 
['2', '2343333', 'bana', 'twelve', ''] 
['3', '3549287', 'moredp', 'twelve', ''] 
['3', '9383737', 'hinsila', 'twelve', ''] 
['3', '8272655', 'hinsila', 'eight', ''] 

或者老式的方法:

>>> with open("file.txt") as f: 
...  [line.split() for line in f] 
... 
[['N', 'ID', 'REMAIN', 'VERS'], 
['2', '2343333', 'bana', 'twelve'], 
['3', '3549287', 'moredp', 'twelve'], 
['3', '9383737', 'hinsila', 'twelve'], 
['3', '8272655', 'hinsila', 'eight']] 

而對於獲得列值:

>>> l 
[['N', 'ID', 'REMAIN', 'VERS'], 
['2', '2343333', 'bana', 'twelve'], 
['3', '3549287', 'moredp', 'twelve'], 
['3', '9383737', 'hinsila', 'twelve'], 
['3', '8272655', 'hinsila', 'eight']] 
>>> {l[0][i]: [line[i] for line in l[1:]] for i in range(len(l[0]))} 
{'ID': ['2343333', '3549287', '9383737', '8272655'], 
'N': ['2', '3', '3', '3'], 
'REMAIN': ['bana', 'moredp', 'hinsila', 'hinsila'], 
'VERS': ['twelve', 'twelve', 'twelve', 'eight']} 
+0

因此,如何將每個值讀入字典或列表,以便列表中的所有第一列和列表中的所有第二列。 – Kilizo

+0

@Kilizo,編輯答案,我認爲這是你想要的。 – utdemir

0

你可以使用一個列表的理解是這樣的:

with open("split.txt","r") as splitfile: 
    for columns in [line.split() for line in splitfile]: 
     print(columns) 

然後你會在2d a中獲得它讓你以任何你喜歡的方式將它分組。

1
with open("path\sample1.csv") as f: 
    for line in f: 
     print line 

//讀取一行文件中的行

+1

這不會回答這個問題......代碼也沒有適當的縮進 –

0

只是使用列表

import csv 

columns = [[] for _ in range(4)] # 4 columns expected 

with open('path', rb) as f: 
    reader = csv.reader(f, delimiter=' ') 
    for row in reader: 
     for i, col in enumerate(row): 
      columns[i].append(col) 

或列表,如果列數需要動態增長:

import csv 

columns = [] 

with open('path', rb) as f: 
    reader = csv.reader(f, delimiter=' ') 
    for row in reader: 
     while len(row) > len(columns): 
      columns.append([]) 
     for i, col in enumerate(row): 
      columns[i].append(col) 

最後,你可以打印你的專欄wi th:

for i, col in enumerate(columns, 1): 
    print 'List{}: {{{}}}'.format(i, ','.join(col)) 
0

這個怎麼樣?

f = open("file.txt") 

for i in f: 
    k = i.split() 
    for j in k: 
     print j