如何在保存编码的新.txt文件中合并完整的.txt文件夹?

时间:2014-10-22 23:37:28

标签: python string encoding io

我有一个包含许多非常大的.txt文件的文件夹,它们看起来像这样:

File1:

eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1


File2:
eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1

File3:
eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1
.
.
.
FileN
eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1

有没有人可以帮助我完成这个任务的另一个方法?另一个问题是编码,文件是西班牙语,我想保留标点符号,如口音和类似的东西。我想在new_file中将File1从File1合并到FileN,即:。

NEW_FILE:

eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1
eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1
eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1
eta eta NCFS000 1
lavadora lavador AQ0FS0 0.585262
es ser VSIP3S0 1
muy muy RG 1
buena bueno AQ0FS0 1

这是我试过的:

import os


def concatFiles():
    path = '/Users/user/Desktop/OpinionsTAG_txt\'
    files = os.listdir(path)
    for idx, infile in enumerate(files):
        print ("File #" + str(idx) + "  " + infile)
    concat = ''.join([open(path + f).read() for f in files])
    with open("output_concatFile.txt", "w") as fo:
        fo.write(path + concat)

if __name__ == "__main__":
    concatFiles()

output_contacFile.txt有编码麻烦,我想保留重音和西班牙语符号,例如有些单词看起来像这样:

est√° estar VAIP3S0 

正确的输出如下:

está estar VAIP3S0

3 个答案:

答案 0 :(得分:2)

Zeroth,请注意,整个程序可以在没有Python的情况下完成,作为shell上的一行代码:cat /Users/user/Desktop/OpinionsTAG_txt/* > output_concatFile.txt

首先,为了解决您的问题,正如Joran Beasley解释的那样,您只是忘记了目录路径和文件名之间的/。像这样的错误正是你想要使用os.path而不是像哑字符串那样操纵路径的原因。

接下来,不是在写任何内容之前将所有文件都读入内存,为什么不逐一阅读呢?

更好的是,不是一次读取整个文件,而是一次一个缓冲区;这样,如果你不小心在该目录中删除了一个36GB的文件,你将不会尝试将整个内容读入内存并将计算机置于交换地狱中。 copyfileobj函数会自动为您执行此操作(虽然循环iter(f.read(8192), b'')也可以正常工作)。

此外,尝试在不关闭其中任何文件的情况下尝试打开数千个文件可能不是一个好主意。

如果要保留内容完全,特别是如果这是Python 3.x,您可能需要二进制模式。 (你可以用Unicode文本模式打开文件,使用正确的编码 - 你看到的特定mojibake是由于将UTF-8文本视为MacRoman而引起的,它应该告诉你如何修复它。但是为什么要让事情变得困难?只需将字节复制为字节。)

最后,如果您需要保证文件按照ls显示的顺序显示......那么,Python并不能保证;实际上,listdir明确地说“列表是按任意顺序排列的”。但ls保证按字典顺序排列,这与Python用于排序字符串的默认顺序相同。 (实际上,listdir几乎总是会给你本机目录顺序,而且通常是字典顺序,所以可能不需要这个。但你不应该相信。)

所以:

def concatFiles():
    path = '/Users/user/Desktop/OpinionsTAG_txt'
    files = os.listdir(path)
    with open("output_concatFile.txt", "wb") as fo:
        for f in sorted(files):
            with open(os.path.join(path, f), "rb") as fi:
                shutil.copyfileobj(fi, fo)

答案 1 :(得分:1)

您可以编写为读取而不是首先将所有文件读入内存,只需在迭代每个文件时写入outfile:

def concatFiles():
    path = '/Users/user/Desktop/OpinionsTAG_txt'
    files = os.listdir(path)
    with open("output_concatFile.txt", "w") as fo: 
        for infile in files:
            with open(os.path.join(path, infile)) as fin:
                for line in fin:
                    fo.write(line)

答案 2 :(得分:0)

如果由于某种原因需要Python解决方案,可以在Python中实现cat

#!/usr/bin/env python2
import fileinput

for line in fileinput.input():
    print line,

将其保存到cat.py并合并文件夹中的所有.txt文件,运行:

$ python -mcat /Users/you/Desktop/OpinionsTAG_txt/*.txt > output_concatFile.txt

这是cat.py for Python 3