Как заменить первое число из каждой строки файла «.txt» в python? - PullRequest
0 голосов
/ 28 февраля 2020

проверить это изображение для примера файла .txt, где в каждой строке этого файла я хочу заменить 0 на 1, а также я хочу сохранить файл с тем же именем ..

Как заменить первое число в каждой строке файла .txt из папки, в которой есть кратные файлы .txt в python. также я хочу сохранить то же имя файла после замены.

my code:-

этот код работает и дает мне желаемый результат. Может кто-нибудь предложить более простой подход

import os 
def process_line_item(x):
    index = x[0]
    line_str = x[1]
    new_first_value = [str(1)]
    return ' '.join(new_first_value + x[1].split(' ')[1:])
    
for filename in os.listdir(os.getcwd()):
    if filename.endswith(".txt"):
        data = None
        with open('{}' .format(filename), 'r') as file:
            data = file.read() 
            new_data = '\n'.join(list(map(process_line_item, enumerate(data.split('\n')))))
            with open('{}' .format(filename), 'w') as file_out:
                file_out.write(new_data)

Ответы [ 4 ]

0 голосов
/ 28 февраля 2020
import os
import re

for filename in os.listdir(os.getcwd()):
    if filename.endswith(".txt"):
        with open('{}'.format(filename), 'r+') as file:
            data = file.read()
            new_data = re.sub(r'^0','1',data,flags=re.MULTILINE) 
            file.seek(0)
            file.truncate() 
            file.write(new_data)
            file.close()
0 голосов
/ 28 февраля 2020
import os

for filename in os.listdir(os.getcwd()):
    if filename.endswith(".txt"):
            with open('{}' .format(filename), 'r+') as file:
                lines = file.readlines()
                file.seek(0, 0) #set the pointer to 0,0 cordinate of file
                for line in lines:
                    row = line.strip().split(" ")

                    if not int(row[0]):
                        row[0] = '1'
                        print(row)
                        file.write(" ".join(row) + "\n")

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

0 голосов
/ 28 февраля 2020

TLDR:

find . -type f -name "*.txt" | xargs -I{} sed -i '' 's/0/1/' {}

Подробно:

Шаги:

  1. Найти все целевые файлы : find . -type f -name "*.txt".
  2. sed - это швейцарский нож для замены строки для указанного файла, параметр регулярного выражения 's/0/1/' соответствует первому вхождению 0 и заменяет его на 1, как вы sh, -i '' означает переопределение исходного файла.
  3. xargs используется для анализа результата файла в каждом отдельном файле и передачи его в sed как stdin рекурсивно.

Готово! Команды shell отлично справляются с подобными задачами!

Кстати, добро пожаловать в переполнение стека!

0 голосов
/ 28 февраля 2020

Вы можете использовать «r +», чтобы открыть файл для чтения и записи в один go.

import os


def process_line_item(x):
    index = x[0]
    line_str = x[1]
    new_first_value = [str(1)]
    return ' '.join(new_first_value + x[1].split(' ')[1:])


for filename in os.listdir(os.getcwd()):
    if filename.endswith(".txt"):
        data = None
        with open('{}'.format(filename), 'r+') as file:
            data = file.read()
            new_data = '\n'.join(list(map(process_line_item, enumerate(data.split('\n')))))
            file.write(new_data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...