将文本文件夹与单元格中的每个内容组合成CSV

时间:2017-01-28 18:16:26

标签: python r csv

我有一个包含数千个.txt文件的文件夹。我想根据以下模型将它们组合成一个大的.csv:

enter image description here

我发现R脚本应该完成这项工作(https://gist.github.com/benmarwick/9265414),但它会显示此错误。

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : duplicate 'row.names' are not allowed 

我不明白我的错误是什么。

无论如何,我很确定没有R就有办法做到这一点。如果你知道一个非常优雅和简单的方法,那将是值得赞赏的(对很多像我这样的人来说很有用)

PRECISION:文本文件是法语,因此不是ASCII。以下是一个示例:https://www.dropbox.com/s/rj4df94hqisod5z/Texts.zip?dl=0

3 个答案:

答案 0 :(得分:4)

以下python脚本适用于我(其中path_of_directory替换为您的文件所在目录的路径,output_file.csv是您要创建/覆盖的文件的路径:< / p>

#! /usr/bin/python

import os
import csv

dirpath = 'path_of_directory'
output = 'output_file.csv'
with open(output, 'w') as outfile:
    csvout = csv.writer(outfile)
    csvout.writerow(['FileName', 'Content'])

    files = os.listdir(dirpath)

    for filename in files:
        with open(dirpath + '/' + filename) as afile:
            csvout.writerow([filename, afile.read()])
            afile.close()

    outfile.close()

请注意,这假设目录中的所有内容都是文件。

答案 1 :(得分:3)

可以使用 pathlib 稍微更紧凑地编写。

>>> import os
>>> os.chdir('c:/scratch/folder to process')
>>> from pathlib import Path
>>> with open('big.csv', 'w') as out_file:
...     csv_out = csv.writer(out_file)
...     csv_out.writerow(['FileName', 'Content'])
...     for fileName in Path('.').glob('*.txt'):
...         csv_out.writerow([str(fileName),open(str(fileName.absolute())).read().strip()])

这个glob产生的项目提供了对完整路径名和文件名的访问,因此不需要连接。

编辑:我已经检查了其中一个文本文件,发现其中一个扼流处理的字符看起来像是&#39; fi&#39;但实际上这两个角色是一个单一的角色。考虑到这个csv可能会被用于实际用途,我建议进行以下处理,忽略像这样的奇怪字符。我删除了轮廓线,因为我怀疑这会使csv处理变得更复杂,并且可能是另一个问题的主题。

import csv
from pathlib import Path

with open('big.csv', 'w', encoding='Latin-1') as out_file:
    csv_out = csv.writer(out_file)
    csv_out.writerow(['FileName', 'Content'])
    for fileName in Path('.').glob('*.txt'):
        lines = [ ]
        with open(str(fileName.absolute()),'rb') as one_text:
            for line in one_text.readlines():
                lines.append(line.decode(encoding='Latin-1',errors='ignore').strip())
        csv_out.writerow([str(fileName),' '.join(lines)])

答案 2 :(得分:2)

如果您的txt文件不是表格格式,那么最好使用readLines()。这是在基础R中执行此操作的一种方法:

setwd("~/your/file/path/to/txt_files_dir") 
txt_files <- list.files()
list_of_reads <- lapply(txt_files, readLines)
df_of_reads <- data.frame(file_name = txt_files, contents = do.call(rbind, list_of_reads))
write.csv(df_of_reads, "one_big_CSV.csv", row.names = F)