Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过提取特定列并将列命名为文件名,将tsv文件合并到一个csv中_Python_Python 3.x_Csv - Fatal编程技术网

Python 通过提取特定列并将列命名为文件名,将tsv文件合并到一个csv中

Python 通过提取特定列并将列命名为文件名,将tsv文件合并到一个csv中,python,python-3.x,csv,Python,Python 3.x,Csv,我在文件夹中有多个tsv文件。从每个文件中,我必须提取第一列(丰度)和第五列(ID),列没有标题。我必须将每个文件中的这些列合并到一个文件中,并将它们的标题作为文件名。我还要比较检查所有的ID'a是否都存在,如果没有,那么值应该是零 其中一个示例文件文件名1如下所示: 0.11 31 31 U 0未分类 99.89 29001 0-1根 99.89 29001 0-131567细胞生物 99.89 29001 64 D 2细菌 59.94 17401 270-1783272土细菌群 53.47

我在文件夹中有多个tsv文件。从每个文件中,我必须提取第一列(丰度)和第五列(ID),列没有标题。我必须将每个文件中的这些列合并到一个文件中,并将它们的标题作为文件名。我还要比较检查所有的ID'a是否都存在,如果没有,那么值应该是零

其中一个示例文件
文件名1
如下所示:

0.11 31 31 U 0未分类
99.89 29001 0-1根
99.89 29001 0-131567细胞生物
99.89 29001 64 D 2细菌
59.94 17401 270-1783272土细菌群
53.47 15522 8 P 1239厚壁菌门
52.10 15127 998 C 186801梭菌
37.83 10982 494 O 186802梭菌
20.61 5983 89 F 186803紫胶螺科
16.95 4922 8 G 1506553 Lachnoclostridium
14.53 4219 0 S 84030[溶糖梭菌]
同样,我有多个文件。我想要的文件如下所示:

ID文件\u name 1文件\u name 2
186802       16.95            37.88
1506553      20.61            0
84030        14.53            0.05
我试过这样的方法:

import glob
import csv
directory = "C:\kraken\kraken_13266"
txt_files = glob.glob(directory+"\*.kraken")

for txt_file in txt_files:
    with open(txt_file, "rt") as input_file, open('output.csv', "wt") as 
    out_file:
     in_txt = csv.reader(input_file, delimiter='\t')
     for line in in_txt:
         firstcolumns = line[:1]
         lastcolumns = line[-2].strip().split(",")
         allcolumns = firstcolumns + lastcolumns

我被困在这一点上了。我应该如何进一步进行。

以下内容应该是您试图做的事情:

from collections import defaultdict    
import glob
import csv

ids = defaultdict(dict)        # e.g. {'186802' : {'FileName1' : '16.95', 'FileName2' : '37.88'}}
kraken_files = glob.glob('*.kraken')

for kraken_filename in kraken_files:
    with open(kraken_filename, 'r', newline='') as f_input:
        csv_input = csv.reader(f_input, delimiter='\t')
        file_name = os.path.splitext(kraken_filename)[0]

        for row in csv_input:
            ids[int(row[4])].update({file_name : float(row[0])})

with open('output.csv', 'w', newline='') as f_output:
    fieldnames = ['ID'] + [os.path.splitext(filename)[0] for filename in kraken_files]
    csv_output = csv.DictWriter(f_output, fieldnames=fieldnames, restval=0)
    csv_output.writeheader()

    for id in sorted(ids.keys()):
        id_values = ids[id]
        id_values['ID'] = id
        csv_output.writerow(id_values)

您需要先读取中的所有文件,然后才能写入输出文件。字典用于存储所有ID。对于每个文件,都会使用一个字典来保存包含匹配ID的每个文件。

您使用的是Python 2.x还是Python 3.x?文件名:file_Name1是每个TSV文件中的第一行吗?或者是文件名本身
文件名1.kraken
?嗨,马丁。我使用的是Python3.x,文件名是“file_Name1”。tsv文件中没有标题。非常感谢Martin。我创造了奇迹,也帮助理解了需要应用于此类问题的逻辑