Как добавить имя файла в последней строке каждого файла? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть набор файлов, которые читаются построчно.Я хотел бы, чтобы в последней строке каждого файла было имя файла рядом с ним.Это код, который выполняет чтение в файловой части, но я не знаю, как получить имена файлов, которые будут отображаться:

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 голосов
/ 08 марта 2019

Я предполагаю, что количество строк больше или равно количеству файлов.

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)
0 голосов
/ 10 марта 2019

Вопрос плохо определен, но при условии, что 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
0 голосов
/ 08 марта 2019

Итак, я предполагаю, что вы берете список файлов, и те столбцы, о которых вы упоминали [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"

Выход:

последний «У меня сыпь .. другое имя файла»

readlines () вернет список всех строк в вашем файле, так что вы можете попробовать вызвать -1, чтобы вытянуть последнюю строку, а затем добавить к ней.

...