这是我正在尝试解析的复杂制表符分隔文件的示例
ENTRY map0010\tNAME Glycolysis\tDESCRIPTION Glycolysis is the process of converting glucose into pyruvate\tCLASS Metabolism\tDISEASE H00071 Hereditary fructose intolerance\tH00072 Pyruvate dehydrogenase complex deficiency\tDBLINKS GO: 0006096 0006094
ENTRY map00020\tNAME Citrate cycle (TCA cycle)\tCLASS Metabolism; Carbohydrate Metabolism\tDISEASE H00073 Pyruvate carboxylase deficiency\tDBLINKS GO: 0006099\tREL_PATHWAY map00010 Glycolysis / Gluconeogenesis\tmap00053 Ascorbate and aldarate metabolism
我正在尝试获取仅包含某些字段的输出,例如:
ENTRY map0010\tNAME Glycolysis\tCLASS Metabolism\tDISEASE H00071 Hereditary fructose intolerance H00072 Pyruvate dehydrogenase complex deficiency\tDBLINKS GO: 0006096 0006094\tNA
ENTRY map00020\tNAME Citrate cycle (TCA cycle)\tCLASS Metabolism; Carbohydrate Metabolism\tDISEASE H00073 Pyruvate carboxylase deficiency\tDBLINKS GO: 0006099\tREL_PATHWAY map00010 Glycolysis / Gluconeogenesis\tmap00053 Ascorbate and aldarate metabolism
主要问题是并非所有行都包含相同数量的字段,因此我需要删除包含字符串“DESCRIPTION”的字段,并在字段“CLASS”的行中添加一个空字段“不在场。
此外,对于某些字段,数据被分成多个(f.i,第1行,DISEASE后面的字段包含疾病数据!)我需要加入它们。
我试过了:
input = open('file', 'r')
dict = ["ENTRY", "NAME", "CLASS", "DISEASE", "DBLINKS", "REL_PATHWAY"]
split_tab = []
output = []
for line in input:
split_tab.append(line.split('\t'))
for item in dict:
for element in split_tab:
if item in element:
output.append(element)
else:
output.append('\tNA\t')
但它保留了所有内容,而不仅仅是dict中指定的元素。 你能帮我吗?
答案 0 :(得分:6)
使用内置的csv库。你的工作会容易得多。
对于一些示例代码:
import csv
reader = csv.reader(open('myfile.csv', 'rb'), dialect='excel-tab')
fieldnames = ['Name','Class']
writer = csv.DictWriter(open('myfile.csv', 'rb'), fieldnames, restval='', extrasaction='ignore', dialect='excel-tab')
for row in reader:
newrow = {}
for field in row:
key = field.split(' ', 1)[0]
newrow[key] = field
writer.writerow(newrow)
特别注意DictWriter的设置方式。如果您包含restval
和extrasaction
字段,则 更容易使用。它们允许您传递具有比作者期望的更多或更少值的字典。
只需设置适当的字段名称,并设置阅读器以使用正确的方言。这可能包括添加您自己的,但csv链接有关于如何执行此操作的说明。
修改强>
在Rob发表评论之后,我对此进行了修订,以考虑到csv方言不像我想象的那么强大的事实。
答案 1 :(得分:3)
requiredKeys = 'ENTRY NAME CLASS DISEASE DBLINKS REL_PATHWAY'.split(' ')
for line in open('file', 'r'):
fields = line.split('\t')
fieldMap = {}
for field in fields:
key = field.split(' ', 1)[0]
fieldMap[key] = field
print '\t'.join([fieldMap.get(key, 'NA') for key in requiredKeys])
答案 2 :(得分:2)
你的行
split_tab.append(line.split( '\ T'))
弄乱了这个。你在列表中列出一个列表。试试这个:
split_tab = line.split('\ t')