我有一组逐行读取的文件。我希望每个文件的最后一行旁边都有文件名。这是完成文件部分读取操作的代码,但是我不知道如何显示文件名:
import glob
a = []
def convert_txt_to_dataframe(path):
for files in glob.glob(path + "./*manual.txt"):
for x in open(files):
a.append(x)
这样就完成了逐行导入所有文本文件的操作,所以现在我希望每个文件的每最后一行旁边都有一个伴随的文件名
我希望它看起来像:
Hello Goodbye
0 Thank you for being a loyal customer. MyDocuments/TextFile1
1 Thank you for being a horrible customer. MyDocuments/TextFile1
2 Thank you for being a nice customer. MyDocuments/TextFile3
答案 0 :(得分:0)
所以我假设您正在获取文件列表,而您提到的[0,1,2]列是指列表中每个文件的最后几行。考虑到这一点,我将尝试一种更简单的方法而不是数据框。而且即使您出于其他原因必须使用数据框,也可以将其转换为文本,作为最后一步,然后尝试以下操作:
Example File ("ExampleText2"):
I love coffee
I love creamer
I love coffee and creamer
I have a rash..
代码:
last = []
with open('exampleText2.txt', 'r') as f:
last = f.readlines()[-1] + " other FileName"
输出:
最后 “我出事了。其他FileName”
readlines()将返回文件中所有行的列表,因此您可以尝试调用-1以拉出最后一行,然后添加到该行。
答案 1 :(得分:0)
我假设行数大于或等于文件数。
import glob
words = ['Thank you for being a loyal customer.',
'Thank you for being a horrible customer.',
'Thank you for being a nice customer.']
def convert(path):
a = []
z = 0
for files in glob.glob(path + "/*.txt"):
temp = [words[z],files]
a.append(temp)
z += 1
print (a)
convert(your_path)
答案 2 :(得分:0)
这个问题定义不明确,但是假设OP希望在DataFrame示例中显示结果(即,不仅最后一行以某种方式用文件名修饰,而且所有行都有),这是一种实现方法。对于此示例,我们只有两个文件:file1.txt
包含两行:'a'和'b',file2.txt
包含一行:'c'。
我们编写了一个文件阅读器,它返回一个列表列表:每个子列表包含文件名和一行。
import glob
def get_file(filename):
with open(filename) as f:
return [[filename, line.rstrip('\n')] for line in f]
尝试一下:
m = map(get_file, glob.glob('file*.txt'))
list(m)
Out[]:
[[['file2.txt', 'c']], [['file1.txt', 'a'], ['file1.txt', 'b']]]
让我们展平这些列表以获得一个二维数组。另外,获得文件按字母顺序排序的结果可能更好。
def flatten(m):
return [k for sublist in m for k in sublist]
m = map(get_file, sorted(glob.glob('file*.txt')))
flatten(m)
Out[]:
[['file1.txt', 'a'], ['file1.txt', 'b'], ['file2.txt', 'c']]
现在,有时行号会有所帮助(例如,如果我们要将数据放入DataFrame中并进行进一步的排序和分析)。我们的读者变为:
def get_file(filename):
with open(filename) as f:
return [[filename, lineno, line.rstrip('\n')] for lineno, line in enumerate(f, start=1)]
m = map(get_file, sorted(glob.glob('file*.txt')))
out = pd.DataFrame(flatten(m), columns=['filename', 'lineno', 'line'])
out
Out[]:
filename lineno line
0 file1.txt 1 a
1 file1.txt 2 b
2 file2.txt 1 c
请注意,如果我们确实有大量文件,则上面的map
很适合多线程读取:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=4) as pool:
m = pool.map(get_file, sorted(glob.glob('file*.txt')))
out = pd.DataFrame(flatten(m), columns=['filename', 'lineno', 'line'])
out
Out[]:
filename lineno line
0 file1.txt 1 a
1 file1.txt 2 b
2 file2.txt 1 c