Як прочитати текстовий файл до списку чи масиву з Python


176

Я намагаюся прочитати рядки текстового файлу до списку чи масиву в python. Мені просто потрібно мати можливість індивідуально отримати доступ до будь-якого елемента в списку або масиві після його створення.

Текстовий файл форматується наступним чином:

0,0,200,0,53,1,0,255,...,0.

Там, де ...вище, там фактичний текстовий файл містить сотні чи тисячі елементів.

Я використовую наступний код, щоб спробувати прочитати файл у списку:

text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()

Вихід, який я отримую:

['0,0,200,0,53,1,0,255,...,0.']
1

Мабуть, це читання всього файлу в списку лише одного елемента, а не списку окремих елементів. Що я роблю неправильно?


1
Так само як замітка. Схоже, це питання слід перефразувати як прочитати файл CSV до списку в Python. Але я відкладаюсь від первісних намірів ОП понад 4 роки тому, які я не знаю.
демонголем


1
Чи відповідає це на ваше запитання? Як перетворити розділений комою рядок у список у Python?
AMC

1
Насправді, дивлячись на верхню відповідь, це дублікат stackoverflow.com/questions/3277503/… .
AMC

Відповіді:


135

Вам доведеться розділити рядок на список значень, використовуючи split()

Так,

lines = text_file.read().split(',')

1
Я думаю , що ця відповідь може бути поліпшений ... Якщо ви вважаєте , багатостроковий .csvфайл (як зазначено в ОП), наприклад, файл , який містить літерні символи 3 по рядках ( a,b,c, d,e,fі т.д.) і застосувати процедуру , описану вище , що ви отримаєте це такий список: ['a', 'b', 'c\nd', 'e', ... ](зверніть увагу на предмет 'c\nd'). Я хотів би додати, що вищезазначена проблема, не змінюючись, ця процедура згортає дані з окремих рядків в одному мега-списку, як правило, не те, що я хочу при обробці файлу даних, орієнтованого на записи.
gboffi

розкол збирається залишити нові рядки. Не робіть цього, використовуйте csvмодуль або інший існуючий парсер
Жан-Франсуа Фабре

42

Ви також можете використовувати numpy loadtxt на зразок

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)

1
Мені це теж потрібно. Я помітив на Raspberry Pi, що оніміння працює дуже повільно. Для цієї програми я повернувся, щоб відкрити файл і прочитати його рядок за рядком.
Guus

2
Це корисно і для визначення формату через dtype : data-typeпараметр. docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html Pandas read_csv дуже простий у використанні. Але я не бачив способу вказати його формат. Він читав поплавці з мого файлу, тоді як мені потрібен рядок. Дякуємо @Thiru за показ loadtxt.
Озгур Озтурк

1
якщо файли txt містять рядки, тоді слід вказати dtype, тому він повинен бути схожим на лінії = loadtxt ("filename.dat", dtype = str, comments = "#", роздільник = ",", розпакувати = False)
Alex M981

19

Отже, ви хочете створити список списків ... Почати потрібно з порожнього списку

list_of_lists = []

далі ми читаємо вміст файлу, рядок за рядком

with open('data') as f:
    for line in f:
        inner_list = [elt.strip() for elt in line.split(',')]
        # in alternative, if you need to use the file content as numbers
        # inner_list = [int(elt.strip()) for elt in line.split(',')]
        list_of_lists.append(inner_list)

Поширений випадок використання - це стовпчикові дані, але наші одиниці зберігання - це рядки файлу, які ми прочитали один за одним, тому ви можете перенести свій список списків. Це можна зробити за допомогою наступної ідіоми

by_cols = zip(*list_of_lists)

Ще одне поширене використання - дати ім’я кожному стовпцю

col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
    by_names[col_name] = by_cols[i]

щоб ви могли працювати з однорідними елементами даних

 mean_apple_prices = [money/fruits for money, fruits in
                     zip(by_names['apples revenue'], by_names['apples_sold'])]

Більшу частину написаного мною можна прискорити за допомогою csvмодуля зі стандартної бібліотеки. Ще один сторонній модуль - pandasце дозволяє автоматизувати більшість аспектів типового аналізу даних (але має ряд залежностей).


Оновлення Хоча в Python 2 zip(*list_of_lists)повертає інший (транспонований) список списків, в Python 3 ситуація змінилася і zip(*list_of_lists)повертає поштовий об'єкт, який не піддається підключенню.

Якщо вам потрібен індексований доступ, ви можете скористатися

by_cols = list(zip(*list_of_lists))

що дає вам список списків в обох версіях Python.

З іншого боку, якщо вам не потрібен індексований доступ, і ви хочете просто створити словник, індексований іменами стовпців, zip-об’єкт просто чудовий ...

file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column

В ОП заявили, що хочуть список даних із CSV, а не "список списків". Просто використовуйте csvмодуль ...
Blairg23,

4

Це питання задає питання, як прочитати вміст значень, розділених комами, з файлу в список, який можна повторити:

0,0,200,0,53,1,0,255,...,0.

Найпростіший спосіб зробити це за допомогою csvмодуля наступним чином:

import csv
with open('filename.dat', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')

Тепер ви можете легко повторити spamreaderтак:

for row in spamreader:
    print(', '.join(row))

Більше прикладів див. У документації .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.