Как добавить новую строку в текстовый файл во всеобъемлющем вложенном списке? - PullRequest
1 голос
/ 24 сентября 2019

У меня есть вложенный список:

A = [['a', 'b', 'c', 'd', 'e'], ['a', 'a', 'b', 'c'], ['b', 'c'], ['a', 'd']]

Я хочу сохранить список A в нескольких текстовых файлах с ограничением 2 вложенных списка на текстовый файл.

Таким образом, вывод должен бытькак:

в small_file_2.txt:

a
b
c
d
e

a
a
b
c

в small_file_4.txt:

b
c

a
d

Я пробовал этот код:

lines_per_file = 2
for lineno, line in enumerate(A):
    if lineno % lines_per_file == 0:
        if smallfile:
           smallfile.close()
        small_filename = 'small_file_{}.txt'.format(lineno + lines_per_file)
        smallfile = open(small_filename, "w")
     smallfile.write('\n'.join(str(x) for x in line)+'\n')         
smallfile.close()

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

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

Исправление довольно простое:

\n.join([]) добавляет \n между каждым элементом, но не до и после.Первый \n, который вы добавили, только что добавили один после.Если вы хотите, чтобы он отделился, вам нужен второй.

lines_per_file = 2
for lineno, line in enumerate(A):
    if lineno % lines_per_file == 0:
        if smallfile:
           smallfile.close()
        small_filename = 'small_file_{}.txt'.format(lineno + lines_per_file)
        smallfile = open(small_filename, "w")
    smallfile.write('\n'.join(str(x) for x in line)+'\n\n')         # <= add a second \n
smallfile.close()
1 голос
/ 24 сентября 2019

Код ниже будет работать в соответствии с вашими требованиями.

lines_per_file = 2
for lineno, line in enumerate(A):
    if lineno % lines_per_file == 0:
        small_filename = 'small_file_{}.txt'.format(lineno + lines_per_file)
    smallfile = open(small_filename, "a")
    smallfile.write('\n'.join(str(x) for x in line)+'\n')
    smallfile.write('\n')
    smallfile.close()
smallfile.close()
1 голос
/ 24 сентября 2019

Второй подход с with и без пустых строк в конце:

lines_per_file = 2
for lineno in range(0, len(A), lines_per_file):
    small_filename = 'small_file_{}.txt'.format(lineno + lines_per_file)
    with smallfile = open(small_filename, "w"): #this will close the file by itself
        smallfile.write('\n\n'.join('\n'.join(str(x) for x in A[current])) for current in range(lineno, min(lineno+lines_per_file, len(A)))

Давайте объясним магию:

for lineno in range(0, len(A), lines_per_file):

Мы будем принимать все строки от 0 доlines_per_file-1, затем lines_per_file в 2 * lines_per_file-1 ... До конца.

'\n'.join(str(x) for x in A[current])

Это то, что вы использовали, но мы вызываем строку непосредственно из A. Анализирует одну строку как отдельные символы внесколько строк.

'\n\n'.join(...)

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

for current in range(lineno, min(lineno+lines_per_file, len(A))

Как я уже сказал, мы берем строкиот белья (то есть: 0, lines_per_file, 2 * lines_per_file ...) до следующего шага.Или до конца буквы А, в зависимости от того, что короче (поэтому есть мин).

...