如何将文件名添加到每个文件的最后读入行?

时间:2019-03-07 22:03:09

标签: python python-3.x dataframe import glob

我有一组逐行读取的文件。我希望每个文件的最后一行旁边都有文件名。这是完成文件部分读取操作的代码,但是我不知道如何显示文件名:

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

3 个答案:

答案 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