Python 将制表符分隔的文件与不同行长度的文件水平合并
我是一个完全的编程新手,因此我为任何缺乏清晰度、极度混乱等表示歉意。我正在尝试将大量文件合并到一个文件中。每个文件用相同数量的列(13)以制表符分隔,但行数不同(~40000)。我希望最终产品包含Python 将制表符分隔的文件与不同行长度的文件水平合并,python,unix,merge,padding,multiple-columns,Python,Unix,Merge,Padding,Multiple Columns,我是一个完全的编程新手,因此我为任何缺乏清晰度、极度混乱等表示歉意。我正在尝试将大量文件合并到一个文件中。每个文件用相同数量的列(13)以制表符分隔,但行数不同(~40000)。我希望最终产品包含 file1col1 file1col2 ... file1col13 file2col1 file2col2 ... file2col13 file3col1 ... etc (其中所有空格都是制表符) 只要保留了我的所有列,
file1col1 file1col2 ... file1col13 file2col1 file2col2 ... file2col13 file3col1 ... etc
(其中所有空格都是制表符)
只要保留了我的所有列,文件的结尾可以以任何方式填充
我试图做的是在unix中简单地使用粘贴命令;然而,这并没有保留我的专栏。我试着从一堆稍有不同的问题中寻找答案,但我恐怕我是个初学者,甚至不知道怎么做。我更愿意使用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查看),所有内容都变得混乱和不对齐。我不知道如何最好地表达这一点,而且我没有发布图像的声誉。假设您的文件名列表存储在一个名为
文件名的数组中(我在命名变量时尽量不富于想象力)。如果在命令行中给出了名称,您可以简单地按照
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()
方法获取字符串列表中的元素,并使用分隔选项卡将它们连接起来。您所说的“我的粘贴命令没有保留我的列”是什么意思?您能显示实际的命令和输出的示例吗?没有粘贴-d$'\t'f1 f2。。。fn
对你有用吗?我从41个文件开始,每个文件有13列,行数可变。那么输出将有533列和最长文件的行数。您希望在输出的末尾发生什么?您是否希望为不再具有数据的每个文件的每行生成12个选项卡(分隔13列),以及将这13列与下一个或上一个文件的列分隔开的选项卡?是的,这将是理想的,或者可以用0或其他内容填充,只要每个文件都有自己的数据对齐,感谢您提供详细的解决方案!我遇到的一个问题是,我在files.append(open(File,“r”))TypeError:强制使用Unicode:需要字符串或缓冲区,键入find,我担心我太无知了,不知道如何修复它。对不起,这是我代码中的一个错误,open()的参数
应该是一个文件名,而不是一个已经打开的文件。另一个编辑器很好地修复了第一个输出中的一个严重错误。write()
调用代码现在执行得很好,非常感谢您的帮助!