Python для чтения текстовых файлов и удаления строк, содержащих ту же часть - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть тонна (1000+) текстовых файлов, которые выглядят так:

TextTextText('aaa/bbb`ccc' , "ddd.eee");
TextTextText('yyy/iii`ooo' , "rrr.ttt");
TextTextText('aaa/fff`ggg' , "hhh.jjj");

Чего я хочу добиться - это удалить все строки, содержащие одну и ту же часть "aaa", и оставить только одну строку с ним (удалите все дубликаты).

мой код пока:

import os
from collections import Counter

sourcepath = os.listdir('Process_Directory3/')
for file in sourcepath:
    inputfile = 'Process_Directory3/' + file
    outputfile = "Output_Directory/" + file
    lines_seen = set()
    outfile = open(outputfile, "w")
    for line in open(inputfile, "r"):
        print(line)
        cut_line = line.split("'")
        new_line = cut_line[1]
        cut_line1 = new_line.split("/")
        new_line1 = cut_line1[0]
        if new_line1 not in lines_seen:
            outfile.write(new_line1)
            lines_seen.add(new_line1)
outfile.close()

Мой код не работает вообще, я не получаю никаких результатов Консольный отчет:

Line13 in <module>
    new_line = cut_line[1]
    IndexError: list index out of range

Извините за плохое письмо, это мой первый пост: D С наилучшими пожеланиями

Обновление:

Я добавил

startPattern = "TextTextText"
if(startPattern in line):

, чтобы убедиться, что я нацеливаюсь только строк, которые начинаются с «TextTextText», но по какой-то причине я получаю .txt в папке назначения, которая содержит только 1 строку содержимого «aaa».

В конце концов, вот полностью рабочий код:

import os
sourcepath = os.listdir('Process_Directory3/')
for file in sourcepath:
inputfile = 'Process_Directory3/' + file
outputfile = "Output_Directory/" + file
lines_seen = set()
outfile = open(outputfile, "w")

for line in open(inputfile, "r"):
        if line.startswith("TextTextText"):
            try:
                cut_line = line.split("'")
                new_line = cut_line[1]
                cut_line1 = new_line.split("/")
                new_line1 = cut_line1[0]
                if new_line1 not in lines_seen:
                    outfile.write(line)
                    lines_seen.add(new_line1)
            except:
                pass
        else:
            outfile.write(line)
outfile.close()

Спасибо за отличную помощь, ребята!

Ответы [ 3 ]

0 голосов
/ 24 апреля 2020

Похоже, вы столкнулись со строкой внутри вашего файла, которая не имеет ', в этом случае line.split("'") производит list с одним элементом, например

line = "blah blah blah"
cut_line = line.split("'")
print(cut_line)  # ['blah blah blah']

, поэтому пытаетесь получить cut_line[1] привести к ошибке, так как есть только cut_line[0]. Поскольку этот фрагмент вашего кода находится внутри l oop, вы можете избежать этого, перейдя к следующей итерации, используя слово continue, если в cut_line недостаточно элементов, просто замените:

cut_line = line.split("'")
new_line = cut_line[1]

на:

cut_line = line.split("'")
if len(cut_line) < 2:
    continue
new_line = cut_line[1]

Это приведет к игнорированию всех строк без '.

0 голосов
/ 24 апреля 2020

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

import re

lines = [
        "",
        "dfdsa sadfsadf sa",
        "TextTextText('aaa/bbb`ccc' ,dsafdsafsA ",
        "TextTextText('yyy/iii`ooo' ,SDFSDFSDFSA ",
        "TextTextText('aaa/fff`ggg' ,SDFSADFSDF ",
    ]



lines_seen = set()
out_lines = []

for line in lines:

    # SEARCH FOR 'xxx/ TEXT in the line -----------------------------------
    re_result = re.findall(r"'[a-z]+\/", line)

    if re_result:
        print(f're_result {re_result[0]}')
        if re_result[0] not in lines_seen:
            print(f'>>> newly found {re_result[0]}')
            lines_seen.add(re_result[0])
            out_lines.append(line)

print('------------')
for line in out_lines:
    print(line)

Результат

re_result 'aaa/
>>> newly found 'aaa/
re_result 'yyy/
>>> newly found 'yyy/
re_result 'aaa/
------------
TextTextText('aaa/bbb`ccc' ,dsafdsafsA 
TextTextText('yyy/iii`ooo' ,SDFSDFSDFSA 

Вы можете поэкспериментировать с регулярными выражениями здесь regex101.com . Попробуйте r "'. + /" любой символ между' и / или r "'[a-zA-Z] + /" строчные и прописные буквы между' и /.

0 голосов
/ 24 апреля 2020

Используйте блок try-except во внутреннем for l oop. Это предотвратит прерывание вашей программы в случае возникновения ошибки из-за какой-либо строки, которая не содержит ' или /.

Обновление:

Я попробовал приведенный ниже код, и он отлично работал для меня.

sourcepath = os.listdir('Process_Directory3/')
for file in sourcepath:
    inputfile = 'Process_Directory3/' + file
    outputfile = "Output_Directory/" + file
    lines_seen = set()
    outfile = open(outputfile, "w")

    for line in open(inputfile, "r"):
        try:
            cut_line = line.split("'")
            new_line = cut_line[1]
            cut_line1 = new_line.split("/")
            new_line1 = cut_line1[0]
            if new_line1 not in lines_seen:
                outfile.write(line) # Replaced new_line1 with line 
                lines_seen.add(new_line1)
        except:
            pass

    outfile.close() # This line was having bad indentation

Входной файл:

TextTextText('aaa/bbb`ccc' , "ddd.eee");
TextTextText('yyy/iii`ooo' , "rrr.ttt");
TextTextText('aaa/fff`ggg' , "hhh.jjj");
TextTextText('WWW/fff`ggg' , "hhh.jjj");
TextTextText('yyy/iii`ooo' , "rrr.ttt");

Выходной файл:

TextTextText('aaa/bbb`ccc' , "ddd.eee");
TextTextText('yyy/iii`ooo' , "rrr.ttt");
TextTextText('WWW/fff`ggg' , "hhh.jjj");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...