Как прочитать текстовый файл (каждый отдельный элемент в отдельной строке) в 2D-список в Python

#python #python-3.x

Вопрос:

Попытка прочитать текстовый файл в 2D-список в Python. «people2.txt » — это отдельные строки в последовательности (каждый элемент в своей отдельной строке).

 fred
23
ann
27
bob
24
 

Код пока:

 details_list=[]

people2=open("people2.txt","r")

for line in people2.readlines():
    details_list.append(line.split())

people2.close()

print(details_list)
 

Я получаю каждый элемент в своем собственном списке, когда мне нужны «пары»? Я получаю

 [["fred"],["23"],["ann"],["27"],["bob"],["24"]]
 

Что мне нужно, так это:

 [["fred","23"],["ann","27"],["bob","24"]]
 

Комментарии:

1. line.split() вам ничего не нужно, используйте line.strip() для его очистки. Разве вы не предпочли бы использовать словарь?

Ответ №1:

Используйте:

 with open("people.txt") as infile:
    res = []
    for name, value in zip(infile, infile):
        res.append([name.strip(), value.strip()])
print(res)
 

Вывод

 [['fred', '23'], ['ann', '27'], ['bob', '24']]
 

Выражение:

 for name, value in zip(infile, infile):
 

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

Комментарии:

1. Вероятно, вам следует объяснить, что происходит в zip(*[infile]*2) (также, не zip(infile, infile) будет делать?)

2. @AKX обновил ответ, спасибо за совет.

3. Это также можно было бы включить в понимание списка, сделав его приятным и понятным для python! res = [name.strip(), value.strip() for name, value in zip(infile, infile)]

4. @SergeBallesta — это имя файла, который я обычно использую для тестирования. В любом случае обновил ответ. Спасибо, что обратили на это внимание.

Ответ №2:

Если у вас уже есть плоский список строк (который у вас будет, если вы замените line.split() на line.strip() ), вы можете взять 2 фрагмента этого списка с помощью шага 2 (т. Е. Один фрагмент содержит элементы с четным индексом, другой — элементы с нечетным индексом), а затем использовать zip для их объединения:

 lines = ["Fred", "23", "Ann", "27", "Bob", "24"]
pairs = list(zip(lines[::2], lines[1::2]))
print(pairs)
 

Это выводит

 [('Fred', '23'), ('Ann', '27'), ('Bob', '24')]
 

Это работает не только для чтения файлов, но если у вас большой файл, было бы эффективнее просто прочитать их как пары для начала.