2011-09-20 41 views
6

Tôi có một tập tin văn bản, trong đó tôi cần mỗi cột, tốt nhất là vào một từ điển hoặc danh sách, định dạng là:python tập đọc văn bản

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

Tôi đã thử:

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

quả = 'Out of lỗi index'

Cũng thử:

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

Mà dường như để đọc từng char như một cột, thay vì mỗi 'từ'

Tôi muốn để có được bốn cột, ví dụ:

2 
2343333 
bana 
twelve 

vào từ điển riêng biệt hoặc danh sách

Bất kỳ giúp đỡ là rất tốt, cảm ơn!

+0

Bạn sử dụng 'crs = csv.reader (mở (file.txt", "r"), dấu phân cách = ',', quotechar = '|', skipinitialspace = True) 'và có tệp CSV ** khoảng trắng ** dưới dạng 'dấu phân cách'?Cũng in 'row [3]' nếu đây là biến bạn nhận được ở mỗi lần lặp, không phải 'cột [3]'. – eumiro

+0

nếu tôi đặt dấu phân tách thành "" nó tạo ra cùng một đầu ra, tôi chỉ đang chơi với dấu "," để xem liệu tôi có thể thực hiện thay đổi – Kilizo

+0

Vòng lặp 'for' đầu tiên của bạn hoạt động cho tôi hay không. Không có 'lỗi chỉ mục'. – senderle

Trả lời

8

này hoạt động tốt đối với tôi:

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

Nếu bạn muốn chuyển đổi cột để hàng, sử dụng 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')] 

Nếu bạn có dòng trống, hãy lọc chúng trước khi sử dụng 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

Cảm ơn, bạn đã làm cho tôi nhận ra rằng dòng của khoảng trắng gây ra lỗi lập chỉ mục của tôi, tôi nghĩ, làm thế nào tôi có thể loại bỏ dòng trắng? – Kilizo

+0

@Kilizo, xem chỉnh sửa của tôi. – 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', ''] 

Hoặc theo cách cũ:

>>> 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']] 

Và đối với các giá trị cột nhận:

>>> 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

vì vậy làm thế nào bạn sẽ đọc từng giá trị vào một từ điển hoặc danh sách, do đó, tất cả các cột đầu tiên trong một danh sách và tất cả các cột thứ 2 trong một danh sách. – Kilizo

+0

@Kilizo, chỉnh sửa câu trả lời, tôi nghĩ rằng đây là những gì bạn muốn. – utdemir

0

Bạn có thể sử dụng một danh sách hiểu như thế này:

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

Sau đó bạn sẽ có nó trong một 2d một rray cho phép bạn nhóm nó theo bất kỳ cách nào bạn thích.

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

// để đọc dòng tập tin bằng dòng

+1

điều này không trả lời câu hỏi ... cũng là mã thiếu thụt đầu dòng thích hợp –

0

chỉ cần sử dụng một danh sách liệt kê

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) 

hoặc nếu số cột cần để phát triển năng động:

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) 

Cuối cùng, bạn có thể in các cột của mình th:

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

Làm thế nào về điều này?

f = open("file.txt") 

for i in f: 
    k = i.split() 
    for j in k: 
     print j 
Các vấn đề liên quan