水平合并不同长度行的制表符分隔文件

0 投票
1 回答
1462 浏览
提问于 2025-04-18 13:24

我对编程完全是个新手,所以如果我说得不清楚或者让你感到困惑,我先说声抱歉。我现在想做的是把很多文件合并成一个文件。每个文件都是用制表符分隔的,列数都是13,但行数不一样,大约有40000行。我希望最终的文件能包含

file1col1      file1col2   ...   file1col13    file2col1      file2col2   ...   file2col13    file3col1      ...         etc

(其中所有的空格都是制表符)

文件的结尾可以随便填充,只要我的列数能保持不变就行。

我尝试用unix里的paste命令来做这个,但发现它没有保持我的列数。我试着从一些稍微不同的问题中找解决方案,但我担心我太初学者了,连怎么做都不知道。我更倾向于用unix或python来解决这个问题,但我也愿意听听其他建议。

非常感谢你能提供的任何帮助!

附言:我有很多文件(大约40个),所以如果能一次性处理一个目录下所有相同扩展名的文件,那就太好了。

编辑:虽然 paste -D$'\t' *.b > merge 对文件的第一部分有效,输出为

9       13577718        0       0       0       1       0       0       0       0       0       0       0       9       13576563        1       0       0       0       0       0       0       0       0       0       0       9       13577772        0       0       1       0       0       0  ...etc across

但在文件的最后(用tail查看时),所有内容都变得混乱和不对齐。我不太确定怎么最好地表示这个问题,而且我没有足够的声望来发图片。

1 个回答

1

假设你的文件名列表存储在一个叫做 filenames 的数组里(我在命名变量时尽量不太花哨)。如果这些名字是通过命令行输入的,你可以很简单地这样创建:

filenames = sys.argv[1:]

有一种方法可以实现你想要的功能,如下所示。

output = open("yourfile.txt", "w")
files = []
for filename in filenames:
    files.append(open(filename, "r"))
num_files = len(files)
num_empty = 0
while True:
    num_empty = 0
    line = []
    for file in files:
        item = file.readline() # returns empty string after EOF
        if not item: 
            item = "None" # or other marker value
            num_empty += 1
        line.append(item)
    if num_empty == num_files:
        break
    output.write("\t".join([x.strip() for x in line]))
    output.write("\n")
for file in files:
    file.close()
output.close()

.strip() 方法会去掉多余的空白,包括在文本行末尾的换行符,这些换行符是Python读取文本时默认加上的。而 .join() 方法则是把字符串列表中的元素用制表符连接起来。

撰写回答