Cara membaca file teks ke dalam daftar atau array dengan Python

176

Saya mencoba membaca baris file teks ke dalam daftar atau array dengan python. Saya hanya perlu dapat mengakses item mana pun dalam daftar atau array secara individual setelah dibuat.

File teks diformat sebagai berikut:

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

Di mana di ...atas, di sana file teks aktual memiliki ratusan atau ribuan lebih banyak item.

Saya menggunakan kode berikut untuk mencoba membaca file ke dalam daftar:

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

Output yang saya dapatkan adalah:

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

Rupanya itu membaca seluruh file menjadi daftar hanya satu item, bukan daftar item individual. Apa yang saya lakukan salah?

pengguna2037744
sumber
1
Sama seperti catatan. Sepertinya pertanyaan ini harus diulangi seperti cara membaca file csv ke daftar dengan Python. Tapi saya tunduk pada niat asli OP lebih dari 4 tahun yang lalu yang saya tidak tahu.
demongolem
1
Sebenarnya, melihat jawaban teratas, ini adalah duplikat dari stackoverflow.com/questions/3277503/… .
AMC

Jawaban:

135

Anda harus membagi string Anda ke daftar nilai menggunakan split()

Begitu,

lines = text_file.read().split(',')
Achrome
sumber
1
Saya berpikir bahwa jawaban ini bisa menjadi baik ... Jika Anda mempertimbangkan multiline .csvberkas (seperti yang disebutkan oleh OP), misalnya, file yang berisi karakter abjad 3 demi baris ( a,b,c, d,e,f, dll) dan menerapkan prosedur yang dijelaskan di atas apa yang Anda dapatkan adalah daftar seperti ini: ['a', 'b', 'c\nd', 'e', ... ](perhatikan itemnya 'c\nd'). Saya ingin menambahkan bahwa, masalah di atas tidak berkepanjangan, prosedur ini meruntuhkan data dari setiap baris dalam satu daftar besar, biasanya bukan yang saya inginkan saat memproses file data berorientasi rekaman.
gboffi
perpecahan akan meninggalkan baris baru. Jangan lakukan ini, gunakan csvmodul atau parser lain yang ada
Jean-François Fabre
42

Anda juga dapat menggunakan loadtxt seperti numpy

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)
Thiru
sumber
1
Saya butuh ini juga. Saya perhatikan pada Raspberry Pi bahwa numpy bekerja sangat lambat. Untuk aplikasi ini saya kembali membuka file dan membacanya baris demi baris.
Guus
2
Ini berguna untuk menentukan format juga, melalui dtype : data-typeparameter. docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html Pandas read_csv sangat mudah digunakan. Tapi saya tidak melihat cara untuk menentukan format untuk itu. Itu membaca mengapung dari file saya, sedangkan saya membutuhkan string. Terima kasih @ Tsu untuk menunjukkan loadtxt.
Ozgur Ozturk
1
jika file txt berisi string, maka dtype harus ditentukan, jadi itu harus seperti baris = loadtxt ("filename.dat", dtype = str, komentar = "#", pembatas = ",", bongkar = False)
Alex M981
19

Jadi, Anda ingin membuat daftar daftar ... Kita harus mulai dengan daftar kosong

list_of_lists = []

selanjutnya, kita membaca konten file, baris demi baris

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)

Kasing penggunaan umum adalah data kolom, tetapi unit penyimpanan kami adalah baris file, yang telah kami baca satu per satu, jadi Anda mungkin ingin mengubah daftar daftar Anda. Ini bisa dilakukan dengan idiom berikut

by_cols = zip(*list_of_lists)

Penggunaan umum lainnya adalah memberi nama untuk setiap kolom

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]

sehingga Anda dapat beroperasi pada item data yang homogen

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

Sebagian besar dari apa yang saya tulis dapat dipercepat menggunakan csvmodul, dari perpustakaan standar. Modul pihak ketiga lainnya adalah pandas, yang memungkinkan Anda mengotomatisasi sebagian besar aspek analisis data tipikal (tetapi memiliki sejumlah dependensi).


Pembaruan Sementara di Python 2 zip(*list_of_lists)mengembalikan daftar daftar yang berbeda (berubah), dalam Python 3 situasinya telah berubah dan zip(*list_of_lists)mengembalikan objek zip yang tidak dapat disubkripsikan.

Jika Anda membutuhkan akses yang diindeks, Anda dapat menggunakan

by_cols = list(zip(*list_of_lists))

yang memberi Anda daftar daftar di kedua versi Python.

Di sisi lain, jika Anda tidak memerlukan akses yang diindeks dan yang Anda inginkan hanyalah membuat kamus yang diindeks dengan nama kolom, objek zip baik-baik saja ...

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
gboffi
sumber
OP mengatakan mereka menginginkan daftar data dari CSV, bukan "daftar daftar". Cukup gunakan csvmodul ...
Blairg23
4

Pertanyaan ini menanyakan cara membaca konten nilai yang dipisahkan koma dari file ke daftar yang dapat diubah:

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

Cara termudah untuk melakukannya adalah dengan csvmodul sebagai berikut:

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

Sekarang, Anda dapat dengan mudah beralih spamreaderseperti ini:

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

Lihat dokumentasi untuk contoh lebih lanjut.

Blairg23
sumber