代码之家  ›  专栏  ›  技术社区  ›  bernando_vialli

如何将文件名添加到python中每个文件的最后一行

  •  -2
  • bernando_vialli  · 技术社区  · 5 年前

    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 回复  |  直到 5 年前
        1
  •  0
  •   RockAndRoleCoder    5 年前

    所以我假设你正在获取一个文件列表,你提到的列[0,1,2]是指列表中每个文件的最后一行。考虑到这一点,我将尝试一种更简单的方法,而不是数据帧。即使出于其他原因必须使用dataframe,也可以将其转换为文本作为最后一步,然后尝试以下操作:

    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"
    

    输出:

    “我皮疹了。。其他文件名'

    readlines()将返回文件中所有行的列表,因此您可以尝试调用-1来提取最后一行,然后添加到其中。

        2
  •  0
  •   YusufUMS    5 年前

    我假设行数大于或等于文件数。

    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)
    
        3
  •  0
  •   Pierre D    5 年前

    这个问题没有定义好,但是假设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']]
    

    如果我们现在要做的是进一步的数据分析(如果我们要把数据放进一个框架中的话)。我们的读者变成:

    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