Как редактировать текстовый файл? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь редактировать текстовый файл в Python 3.7.По сути, у меня есть текстовый файл (file_1.txt), который содержит цифры - 3 столбца и 5 строк, подобных этой

1, 10, 20
2, 20, 30
3, 30, 50
4, 35, 60
5, 50, 100

Я хотел бы отредактировать этот файл, чтобы получить что-то немного другое,в основном это

1, 10, 20
2, 20, 30
3, 30, 50
4, 35, 60
5, 50, 100
6, 10, 20
7, 20, 30
8, 30, 50
9, 35, 60
10, 50, 100

Второй и третий столбцы копируются, а первый столбец продолжается числами, добавляя по одному в каждой новой строке.Я пытался сделать это, но мне не удалось.Вот что я попробовал:

with open("file_1.txt", "r+") as file1:
    file1.read()
    i = 6
    imax = 10
    while i <= imax:
        sentence = str(i) + "\n"
        file1.write(sentence)
        i = i + 1

Я не понимаю, как скопировать второй и третий столбец.

Кто-нибудь знает, как это сделать?

Ответы [ 8 ]

0 голосов
/ 31 января 2019

Этот модуль также работает:

def edit(nrows, filename):
    nrows +=1 #to avoid off-by-one error because dealing with lists

    outf = open(filename, 'a')

    column_1 = [1, 2, 3, 4, 5]
    column_2 = [10, 20, 30, 35, 50]
    column_3 = [20, 30, 50, 60, 100]

    last_column_1 = column_1[-1]
    list_1 = list(range(last_column_1+1, last_column_1+nrows))
    list_2 = nrows//len(column_2)*column_2 + column_2[0:nrows%len(column_2)]
    list_3 = nrows//len(column_3)*column_3 + column_3[0:nrows%len(column_3)]

    for c1, c2, c3 in zip(list_1, list_2, list_3):
        outf.write("{}, {}, {}\n".format(c1, c2, c3))

if __name__ == '__main__':
    edit(10, 'file.txt')

Предполагается, что есть file.txt с текстом:

1, 10, 20
2, 20, 30
3, 30, 50
4, 35, 60
5, 50, 100
0 голосов
/ 31 января 2019

Этот подход работает непосредственно с каждой строкой как строкой, не разбивая больше столбцов, чем необходимо.

Первый цикл for извлекает Cols 2 и 3 (с начальной запятой) в список, отслеживая количество строк.Второй цикл добавляет к этому индексу приращения списка, начиная с количества.

0 голосов
/ 31 января 2019

Сценарий ниже создаст новый файл, и вы можете установить количество строк, которые вы хотите создать.

Сначала все строки читаются из входного файла, а затем записывается количество строк, которые вы установили в новый файл.

list_emitter может бесконечно выводить элементы из заданного списка, поэтому вы можете просто настроить переменную output_lines_count, чтобы сделать ваш выходной файл еще больше.

def list_emitter(l):
    """This generator will endlessly yield items from given list."""
    while True:
        for item in l:
            yield item


with open('file_1.txt') as input_file:
    lines = input_file.readlines()    # Create list of lines

with open('output_file.txt', 'w') as output_file:
    output_lines_count = 10 # Set how many output lines you want
    for counter, line in enumerate(list_emitter(lines)):
        if counter == output_lines_count:
            break
        first, second, third = line.strip().split() # Parse line
        output_file.write('{}, {} {}\n'.format(counter+1, second, third))
0 голосов
/ 31 января 2019

Сначала вам нужно прочитать все данные из ввода и сохранить их.

Затем снова просмотреть их и записать в файл.

data = []

with open("file_1.txt", "r+") as file1:

    # read the data

    for line in file1:
        # .strip() to remove the newline
        # .split(", ") to split into 3 values
        # map(int, ...) to convert each from string to integer
        index, column2, column3 = map(int, line.strip().split(", "))

        #save the second and third coluumn
        data.append((column2, column3))

    # now write it back again:

    for column2, column3 in data:
        index += 1  # continue incrementing the index

        # format the lines and write them into the file
        file1.write("{}, {}, {}\n".format(index, column2, column3))
0 голосов
/ 31 января 2019

Другой способ:

with open("test.txt", "r+") as file1:
    lines = file1.readlines()
    index = 0
    i = 6
    imax = 10
    while i <= imax:
        sentence = lines[index].split(", ")[1:]
        sentence.insert(0, str(i))
        file1.write(", ".join(sentence))
        i += 1
        index += 1

Вывод:

1, 10, 20
2, 20, 30
3, 30, 50
4, 35, 60
5, 50, 100
6, 10, 20
7, 20, 30
8, 30, 50
9, 35, 60
10, 50, 100
0 голосов
/ 31 января 2019

Pythonic-way: он добавляет новые строки в файл.

with open('sample.txt', 'r') as f:
l = [i.strip() for i in f.readlines()]
max_row = int(l[-1].split(',')[0])

x = [str(i) for i in range(max_row+1,11)]
y = [i.split(',', 1)[-1] for i in l]

with open('sample.txt', 'a') as f:
    for item in [x[i]+',' + y[i] for i in range(len(x))]:
        f.write("%s\n" % item)

PS: максимальная строка может быть длиной числа строк

0 голосов
/ 31 января 2019

Если это csv-подобный файл, вы можете использовать pandas (это один из лучших способов манипулирования данными).Быстрый пример:

import pandas as pd
df = pd.read_csv("<path_to_data_file>", header=None)
df = pd.concat([df, df])
df[0] = list(range(1, 11))
df.to_csv("result.csv", header=None, index=None)
0 голосов
/ 31 января 2019

Коротко и просто.Всего 3 строки.

with open('file_1.txt', 'r+') as f:
    for num, content in enumerate(f.readlines()):
        f.write(f'{num+6}, {content[3:]}')
...