我有一个包含数千个.txt文件的文件夹。我想根据以下模型将它们组合成一个大的.csv:
我发现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
答案 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)