水平合并不同长度行的制表符分隔文件
我对编程完全是个新手,所以如果我说得不清楚或者让你感到困惑,我先说声抱歉。我现在想做的是把很多文件合并成一个文件。每个文件都是用制表符分隔的,列数都是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()
方法则是把字符串列表中的元素用制表符连接起来。