【问题标题】:Trying to output all possible combinations of joining two files尝试输出连接两个文件的所有可能组合
【发布时间】:2013-10-31 02:42:08
【问题描述】:

我有一个包含 24 个不同文件的文件夹,它们都具有相同的制表符分隔格式:

这是一个例子:

zinc-n  with-iodide-n   8.0430  X
zinc-n  with-amount-of-supplement-n 12.7774 X
zinc-n  with-value-of-horizon-n 14.5585 X
zirconium-n as-valence-n    11.3255 X
zirconium-n for-form-of-norm-n  15.4607 X

我想以 2 的每个可能组合加入文件。

例如,我想加入文件 1 和文件 2、文件 1 和文件 3、文件 1 和文件 4...等等,直到我有 552 个文件的输出,将每个文件与每个其他文件考虑到所有独特的组合

我知道这可以通过 cat 在终端中完成。

cat File1 File2 > File1File2
cat File1 File3 > File1File3

...等等。

但是,为每个独特的组合执行此操作将是一个极其费力的过程。

是否有可能使这个过程自动化,例如使用终端中的命令行和 grep 来加入所有独特的组合?或者可能是比 CAT 更优化的解决方案的另一个建议。

【问题讨论】:

    标签: join terminal grep cat


    【解决方案1】:

    你可以试试。我使用来自itertools 模块的combinations() 函数和join() 每对文件的内容。请注意,我使用缓存来避免多次读取每个文件,但您可能会耗尽内存,因此请使用最适合您的方法:

    import sys 
    import itertools
    
    seen = {}
    
    for files in itertools.combinations(sys.argv[1:], 2): 
        outfile = ''.join(files)
        oh = open(outfile, 'w')
    
        if files[0] in seen:
            f1_data = seen[files[0]]
        else:
            f1_data = open(files[0], 'r').read()
            seen[files[0]] = f1_data
    
        if files[1] in seen:
            f2_data = seen[files[1]]
        else:
            f2_data = open(files[1], 'r').read()
            seen[files[1]] = f2_data
    
        print('\n'.join([f1_data, f2_data]), file=oh)
    

    测试:

    假设三个文件的内容如下:

    ==> file1 <==
    file1 one
    f1 two
    
    ==> file2 <==
    file2 one
    file2 two
    
    ==> file3 <==
    file3 one
    f3 two
    f3 three
    

    像这样运行脚本:

    python3 script.py file[123]
    

    它会创建三个包含内容的新文件:

    ==> file1file2 <==
    file1 one
    f1 two
    file2 one
    file2 two
    
    
    ==> file1file3 <==
    file1 one
    f1 two
    file3 one
    f3 two
    f3 three
    
    
    ==> file2file3 <==
    file2 one
    file2 two
    file3 one
    f3 two
    f3 three
    

    【讨论】:

    • 如何保持原始文件的格式。例如,连接两个文件后,无法识别结束行(即其中一个结果文件如下: zirconium-n for-form-of-norm-n 15.4607 Xzinc-n with-iodide-n 8.0430 X zinc -n with-amount-of-supplement-n 12.7774 X ) 我将打印修改为 print(''.join([f1_data, f2_data] + "\n"), file=oh) 但它给了我一个错误。你有什么建议?
    • @owwoow14:Python3 还是 Python2? Windows、Linux 还是什么操作系统?
    • 我使用了 Python3(如您的示例所示)。我在 MacOSx 和 Linux 上都试过了。
    • 你的意思是它会删除所有换行符吗?真奇怪。我猜你的输入数据比来自python 的问题更多。如果你用新文件创建一个像我这样的测试,它会起作用吗?
    • 事实上,我确实在三个文件(我将其命名为:File1 File2 和 File3)中创建了 2 个不同行(4 个制表符分隔的列)的“试用”文件,其中包含确切内容的示例我想要使​​用的实际文件。我检查了文件的编码(我在 Mac 上使用 TextMate 创建了它们),上面写着 MacOSRoman,它应该可以识别换行符。
    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多