Python nhập csv vào danh sách


192

Tôi có một tệp CSV với khoảng 2000 hồ sơ.

Mỗi bản ghi có một chuỗi và một danh mục cho nó:

This is the first line,Line1
This is the second line,Line2
This is the third line,Line3

Tôi cần đọc tệp này vào một danh sách giống như thế này:

data = [('This is the first line', 'Line1'),
        ('This is the second line', 'Line2'),
        ('This is the third line', 'Line3')]

Làm cách nào để nhập CSV này vào danh sách tôi cần bằng Python?


2
Sau đó sử dụng csvmô-đun: docs.python.org/2/library/csv.html
furas

4
Nếu có một câu trả lời phù hợp với câu hỏi của bạn, xin vui lòng chấp nhận nó.
Maciej Gol

Câu trả lời:


304

Sử dụng mô-đun csv :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = list(reader)

print(data)

Đầu ra:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

Nếu bạn cần bộ dữ liệu:

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = [tuple(row) for row in reader]

print(data)

Đầu ra:

[('This is the first line', 'Line1'), ('This is the second line', 'Line2'), ('This is the third line', 'Line3')]

Câu trả lời cũ của Python 2, cũng sử dụng csvmô-đun:

import csv
with open('file.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print your_list
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]

4
Tại sao bạn sử dụng 'rb' thay vì 'r'?
imrek

5
@DrunkenMaster, bkhiến tệp được mở ở chế độ nhị phân trái ngược với chế độ văn bản. Trên một số hệ thống, chế độ văn bản có nghĩa là \nsẽ được chuyển đổi thành dòng mới dành riêng cho nền tảng khi đọc hoặc viết. Xem tài liệu .
Maciej Gol

7
Điều này không hoạt động trong Python 3.x: "csv.Error: iterator sẽ trả về chuỗi, không phải byte (bạn đã mở tệp ở chế độ văn bản chưa?)" Xem bên dưới để biết câu trả lời hoạt động trong Python 3.x
Gilbert

2
để tiết kiệm vài giây thời gian gỡ lỗi, có lẽ bạn nên thêm một ghi chú cho giải pháp đầu tiên, như "phiên bản Python 2.x"
thiên đường

Làm cách nào để sử dụng giải pháp đầu tiên của bạn nhưng chỉ với một số cột trong tệp csv?
Sigur

54

Đã cập nhật cho Python 3 :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print(your_list)

Đầu ra:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

Chỉ định 'r'là chế độ mặc định, vì vậy chỉ định nó là không cần thiết. Các tài liệu cũng đề cập đến Nếu csvfile là một đối tượng tệp, nó sẽ được mở bằng newline = ''.
AMC

43

Gấu trúc khá giỏi trong việc xử lý dữ liệu. Đây là một ví dụ về cách sử dụng nó:

import pandas as pd

# Read the CSV into a pandas data frame (df)
#   With a df you can do many things
#   most important: visualize data with Seaborn
df = pd.read_csv('filename.csv', delimiter=',')

# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]

# or export it as a list of dicts
dicts = df.to_dict().values()

Một lợi thế lớn là gấu trúc tự động xử lý các hàng tiêu đề.

Nếu bạn chưa từng nghe về Seaborn , tôi khuyên bạn nên xem qua.

Xem thêm: Làm cách nào để đọc và ghi tệp CSV bằng Python?

Gấu trúc # 2

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
dicts = df.to_dict('records')

Nội dung của df là:

     country   population population_time    EUR
0    Germany   82521653.0      2016-12-01   True
1     France   66991000.0      2017-01-01   True
2  Indonesia  255461700.0      2017-01-01  False
3    Ireland    4761865.0             NaT   True
4      Spain   46549045.0      2017-06-01   True
5    Vatican          NaN             NaT   True

Nội dung của dicts là

[{'country': 'Germany', 'population': 82521653.0, 'population_time': Timestamp('2016-12-01 00:00:00'), 'EUR': True},
 {'country': 'France', 'population': 66991000.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': True},
 {'country': 'Indonesia', 'population': 255461700.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': False},
 {'country': 'Ireland', 'population': 4761865.0, 'population_time': NaT, 'EUR': True},
 {'country': 'Spain', 'population': 46549045.0, 'population_time': Timestamp('2017-06-01 00:00:00'), 'EUR': True},
 {'country': 'Vatican', 'population': nan, 'population_time': NaT, 'EUR': True}]

Gấu trúc # 3

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
lists = [[row[col] for col in df.columns] for row in df.to_dict('records')]

Nội dung của listslà:

[['Germany', 82521653.0, Timestamp('2016-12-01 00:00:00'), True],
 ['France', 66991000.0, Timestamp('2017-01-01 00:00:00'), True],
 ['Indonesia', 255461700.0, Timestamp('2017-01-01 00:00:00'), False],
 ['Ireland', 4761865.0, NaT, True],
 ['Spain', 46549045.0, Timestamp('2017-06-01 00:00:00'), True],
 ['Vatican', nan, NaT, True]]

tuples = [tuple(x) for x in df.values]có thể được viết tuples = list(df.itertuples(index=False))thay thế. Xin lưu ý rằng các tài liệu Pandas không khuyến khích việc sử dụng có .valueslợi cho .to_numpy(). Ví dụ thứ ba là khó hiểu với tôi. Đầu tiên, bởi vì biến được đặt tên tuples, điều này có nghĩa là nó là một danh sách các bộ dữ liệu, trong khi đó thực sự là một danh sách các danh sách. Thứ hai, bởi vì theo như tôi có thể nói rằng toàn bộ biểu thức có thể được thay thế bằng df.to_list(). Tôi cũng không biết liệu ví dụ thứ hai có thực sự phù hợp ở đây không.
AMC

9

Cập nhật cho Python3:

import csv
from pprint import pprint

with open('text.csv', newline='') as file:
    reader = csv.reader(file)
    res = list(map(tuple, reader))

pprint(res)

Đầu ra:

[('This is the first line', ' Line1'),
 ('This is the second line', ' Line2'),
 ('This is the third line', ' Line3')]

Nếu csvfile là một đối tượng tập tin, nó sẽ được mở bằng newline=''.
mô đun csv


Tại sao sử dụng list(map())trên một danh sách hiểu? Ngoài ra, chú ý khoảng trắng ở đầu mỗi phần tử của cột thứ hai.
AMC

5

Nếu bạn chắc chắn không có dấu phẩy trong đầu vào của bạn, trừ để tách các hạng mục, bạn có thể đọc những dòng tập tin bằng cách dòngchia trên ,, sau đó đẩy các kết quả đểList

Điều đó nói rằng, có vẻ như bạn đang xem một tệp CSV, vì vậy bạn có thể cân nhắc sử dụng các mô-đun cho nó


4
result = []
for line in text.splitlines():
    result.append(tuple(line.split(",")))

1
Bạn có thể vui lòng thêm một chút giải thích cho bài viết này? Mã chỉ là (đôi khi) tốt, nhưng mã và giải thích là (hầu hết các lần) tốt hơn
Barranka

3
Tôi biết nhận xét của Barranka đã hơn một năm tuổi, nhưng với bất kỳ ai tình cờ phát hiện ra điều này và không thể hiểu được: đối với dòng trong text.splitlines (): đặt từng dòng riêng lẻ trong "dòng" biến tạm thời. line.split (",") tạo danh sách các chuỗi được phân tách trên dấu phẩy. tuple (~) đặt danh sách đó trong một tuple và chắp thêm (~) thêm nó vào kết quả. Sau vòng lặp, kết quả là một danh sách các bộ dữ liệu, với mỗi bộ dữ liệu một dòng và mỗi bộ phần tử một phần tử trong tệp csv.
Louis

Ngoài những gì @Louis đã nói, không cần sử dụng .read().splitlines(), bạn có thể lặp lại trực tiếp từng dòng của tệp: for line in in_file: res.append(tuple(line.rstrip().split(",")))Ngoài ra, hãy lưu ý rằng việc sử dụng .split(',')có nghĩa là mọi phần tử của cột thứ hai sẽ bắt đầu có thêm khoảng trắng.
AMC

Phụ lục cho mã tôi vừa chia sẻ ở trên: line.rstrip()-> line.rstrip('\n').
AMC

3

Như đã nói trong các ý kiến, bạn có thể sử dụng csvthư viện trong python. csv có nghĩa là các giá trị được phân tách bằng dấu phẩy có vẻ chính xác là trường hợp của bạn: nhãn và giá trị được phân tách bằng dấu phẩy.

Là một loại và loại giá trị, tôi muốn sử dụng một loại từ điển thay vì một danh sách các bộ dữ liệu.

Dù sao trong đoạn mã dưới đây tôi chỉ ra cả hai cách: dlà từ điển và llà danh sách các bộ dữ liệu.

import csv

file_name = "test.txt"
try:
    csvfile = open(file_name, 'rt')
except:
    print("File not found")
csvReader = csv.reader(csvfile, delimiter=",")
d = dict()
l =  list()
for row in csvReader:
    d[row[1]] = row[0]
    l.append((row[0], row[1]))
print(d)
print(l)

Tại sao không sử dụng trình quản lý bối cảnh để xử lý tệp? Tại sao bạn trộn hai quy ước đặt tên biến khác nhau? Không (row[0], row[1])yếu hơn / dễ bị lỗi hơn là chỉ sử dụng tuple(row)?
AMC

Tại sao bạn nghĩ làm tuple (hàng) ít bị lỗi hơn? Bạn đang đề cập đến quy ước đặt tên biến nào? Vui lòng liên kết một quy ước đặt tên python chính thức. Theo như tôi biết thì thử -except là một cách tốt để xử lý các tệp: bạn có ý nghĩa gì với trình xử lý bối cảnh?
Francesco Boi

Tại sao bạn nghĩ làm tuple (hàng) ít bị lỗi hơn? Bởi vì nó không yêu cầu bạn viết ra từng chỉ mục một cách thủ công. Nếu bạn mắc lỗi hoặc số lượng phần tử thay đổi, bạn phải quay lại và thay đổi mã của mình. Cố gắng ngoại trừ là tốt, các nhà quản lý bối cảnh là tuyên bố với. Bạn có thể tìm thấy nhiều tài nguyên về chủ đề này, chẳng hạn như tài nguyên này .
AMC

Tôi không thấy trình quản lý bối cảnh sẽ tốt hơn khối ngoại trừ thử tốt như thế nào. Mặt khác, khía cạnh tích cực là u gõ ít mã hơn; đối với phần còn lại nếu số phần tử (tôi đoán bạn có nghĩa là số lượng cột) thay đổi của tôi thì tốt hơn vì nó chỉ trích xuất các giá trị mong muốn trong khi phần còn lại trích xuất tất cả excel. Nếu không có bất kỳ yêu cầu cụ thể nào, bạn không thể nói cái nào tốt hơn nên sẽ lãng phí thời gian để tranh luận cái nào tốt hơn: trong trường hợp này cả hai đều hợp lệ
Francesco Boi

Tôi không thấy trình quản lý bối cảnh sẽ tốt hơn khối ngoại trừ thử tốt như thế nào. Vui lòng xem nhận xét trước đây của tôi, trình quản lý bối cảnh sẽ không thay thế thử ngoại trừ.
AMC

2

Một vòng lặp đơn giản sẽ đủ:

lines = []
with open('test.txt', 'r') as f:
    for line in f.readlines():
        l,name = line.strip().split(',')
        lines.append((l,name))

print lines

1
Điều gì nếu một số mục có dấu phẩy trong đó?
Tony Enni

@TonyEnnis Sau đó, bạn sẽ cần sử dụng một vòng xử lý nâng cao hơn. Câu trả lời của Maciej ở trên cho thấy cách sử dụng trình phân tích cú pháp csv đi kèm với Python để thực hiện thao tác này. Trình phân tích cú pháp này rất có thể có tất cả logic bạn cần.
Hunter McMillen

1

Thật không may, tôi không tìm thấy câu trả lời nào đặc biệt thỏa mãn.

Đây là một giải pháp Python 3 đơn giản và đầy đủ, sử dụng mô-đun csv .

import csv

with open('../resources/temp_in.csv', newline='') as f:
    reader = csv.reader(f, skipinitialspace=True)
    rows = list(reader)

print(rows)

Chú ý skipinitialspace=Truelập luận. Điều này là cần thiết vì thật không may, CSV của OP chứa khoảng trắng sau mỗi dấu phẩy.

Đầu ra:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

0

Mở rộng yêu cầu của bạn một chút và giả sử bạn không quan tâm đến thứ tự các dòng và muốn phân nhóm chúng theo các danh mục, giải pháp sau có thể phù hợp với bạn:

>>> fname = "lines.txt"
>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> with open(fname) as f:
...     for line in f:
...         text, cat = line.rstrip("\n").split(",", 1)
...         dct[cat].append(text)
...
>>> dct
defaultdict(<type 'list'>, {' CatA': ['This is the first line', 'This is the another line'], ' CatC': ['This is the third line'], ' CatB': ['This is the second line', 'This is the last line']})

Bằng cách này, bạn có được tất cả các dòng có liên quan có sẵn trong từ điển dưới khóa là thể loại.


0

Đây là cách dễ nhất trong Python 3.x để nhập CSV vào một mảng nhiều chiều và chỉ có 4 dòng mã mà không cần nhập bất cứ thứ gì!

#pull a CSV into a multidimensional array in 4 lines!

L=[]                            #Create an empty list for the main array
for line in open('log.txt'):    #Open the file and read all the lines
    x=line.rstrip()             #Strip the \n from each line
    L.append(x.split(','))      #Split each line into a list and add it to the
                                #Multidimensional array
print(L)

Hãy cẩn thận, đó là một danh sách, không phải là một mảng! Tại sao không sử dụng trình quản lý bối cảnh để xử lý đúng đối tượng tệp? Lưu ý rằng giải pháp này để lại khoảng trắng thừa trên mục thứ hai trong mỗi hàng và nó sẽ thất bại nếu bất kỳ dữ liệu nào chứa dấu phẩy.
AMC

-1

Tiếp theo là một đoạn mã sử dụng mô-đun csv nhưng trích xuất nội dung file.csv vào danh sách các ký tự sử dụng dòng đầu tiên là tiêu đề của bảng csv

import csv
def csv2dicts(filename):
  with open(filename, 'rb') as f:
    reader = csv.reader(f)
    lines = list(reader)
    if len(lines) < 2: return None
    names = lines[0]
    if len(names) < 1: return None
    dicts = []
    for values in lines[1:]:
      if len(values) != len(names): return None
      d = {}
      for i,_ in enumerate(names):
        d[names[i]] = values[i]
      dicts.append(d)
    return dicts
  return None

if __name__ == '__main__':
  your_list = csv2dicts('file.csv')
  print your_list

1
Tại sao không chỉ sử dụng csv.DictReader?
AMC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.