如何将一个充满了.txt文件的文件夹合并到一个保留编码的新.txt文件中?

2024-06-07 02:52:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件夹,里面有很多非常大的.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

有人能帮我再做一个关于这项任务的建议吗?,另一个问题是编目,文件是西班牙文的,我想保留标点符号,像重音符号之类的。我想在新的_文件中从File1合并到FileN,即:

新建_文件:

^{pr2}$

这就是我所尝试的:

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()

输出_连续文件.txt有编码问题,我想保留口音和西班牙语符号,例如有些单词如下所示:

est√° estar VAIP3S0 

正确的输出如下:

está estar VAIP3S0

Tags: 文件pathtxtesserrgetancfs000
3条回答

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

#!/usr/bin/env python2
import fileinput

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

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

^{pr2}$

这是^{} for Python 3。在

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

{jorley>解释了你的第一个目录名和文件名之间的问题。像这样的错误正是您希望使用^{}而不是像哑字符串那样操作路径的原因。在

接下来,与其在写任何东西之前将所有文件读入内存,为什么不逐个读取它们呢?在

更妙的是,与其一次读取整个文件,不如一次读取一个缓冲区;这样,如果你不小心把一个36GB的文件放到那个目录中,你就不会试图把整个文件读入内存,然后把你的计算机扔进交换地狱。^{}函数会自动为您完成这项工作(尽管在^{}上循环也可以正常工作)。在

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

如果您想准确地保存内容,尤其是python3.x,那么您可能需要二进制模式。(你可以用正确的编码以Unicode文本模式打开文件。你看到的特定mojibake是由于把UTF-8文本当作MacRoman来处理,这应该会告诉你如何修复它。但为什么让事情变得困难?只需将字节复制为字节。)

最后,如果您需要保证文件按ls显示的顺序显示……那么,Python并不保证;事实上,^{}显式地说“列表是以任意顺序排列的。”但是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)

您可以按读方式写入,而不是先将所有文件读入内存,只需在遍历每个文件时写入输出文件:

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)

相关问题 更多 >