簡體   English   中英

循環用於在Python中解析復雜制表符分隔/ csv文件

[英]Loop for Parsing complex tab delimited/csv files in Python

為了清楚起見,我對編程非常陌生,而且我正在使用Python 3.3! 現在我有相同基本布局的很多文件。 每個文件有9列,制表符分隔和可變數量的標題行 - 但大多數都有五行。 行或列沒有標題!

看起來像這樣:

#header1
#header2
#header3
#header4
#header5
ID1    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes1..
ID2    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes2..
ID3    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes3..
ID4    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes4..

我想要的唯一信息是第一列,其中包含ID,最后一列包含有關每個ID的注釋。 我正在為這樣的字典拍攝

{'ID1': [notes1...]
 'ID2': [notes2...]....
 'ID1234': [notes1234...]}

但我會對詞典列表或類似的詞匯感到高興。

所以我開始將文本轉換為列表列表,以便我可以按索引查找條目:

import csv

list_all = list(csv.reader(open(r'complex_tabbed_file.gff', 'rb'), delimiter='\t'))

d = dict()
ID = data[5][0]     #starting at 5 to skip the header lines
notes = data[5][8]
d[ID]= notes

print (d)

這給了我正在尋找的信息,但我只讀了一個條目。 我需要創建一個循環來讀取整個文件,其中包含數百個條目......起點上的建議?

我研究並發現: 使用csv模塊從csv文件中讀取特定列?

這描述了類似的情況,但編碼有點過頭了。 因為我是一個新手,我很難將這個例子應用到我的特定情況=(

這就是我在迭代中所嘗試的:

i=0

if i < 4:
    i= i+1

if i >= 5:
    ID = list_all[i][0]
    notes = list_all[i][8] 
    i= i+1

print (d)

這會返回一個空字典(d = {})不好。

也試過了

d = dict()  
i=5
for line in list_all: 
    ID = list_all[i][0]
    notes = list_all[i][8] 
    i = i+1

print (d)

這給了如此可愛的“列表索引超出范圍”錯誤消​​息。 我真的很感激任何建議,謝謝!

您可以解決迭代每一行並丟棄那些只有一個字段(標題)的行:

import csv
import sys

d = dict()

with open(sys.argv[1], newline='') as csvfile:
    csvreader = csv.reader(csvfile, delimiter='\t')
    for row in csvreader:
        if len(row) == 1: continue
        _d = {row[0]: [row[-1]]}
        d.update(_d)

print(d)

運行它像:

python3 script.py infile

產量:

{
    'ID4': ['Notes4..'], 
    'ID1': ['Notes1..'], 
    'ID2': ['Notes2..'], 
    'ID3': ['Notes3..']
}

閱讀你的代碼確實讓我想知道你是否閱讀過這些文檔? 第一個微小的例子遍歷所有條目/行...: http//docs.python.org/2/library/csv.html

無論如何,調查它csv模塊無法過濾注釋,但你可以使用python自己的filter

import csv
d = dict()
f = file('data.csv')
data = csv.reader(filter(lambda row: row[0]!='#', f), delimiter='\t')
for row in data:
  #print row
  d.update({row[0]: row[1:]})
f.close()
print(d)

您可能會考慮使用DictReader而不是reader ...

有時完全跳過csv模塊更容易:

from pprint import pprint
d = dict()
with open('complex_tabbed_file.gff') as input_file:
  for line in input_file:
    line = line.split('\t')
    if len(line) > 1:
      d[line[0]] = [line[-1].strip()]

pprint(d)

暫無
暫無

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

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