Hướng dẫn python csv to namedtuple - python csv sang têntuple

Cách tốt nhất để lấy tệp dữ liệu có chứa hàng tiêu đề và đọc hàng này thành một tuple được đặt tên để các hàng dữ liệu có thể được truy cập bằng tên tiêu đề là gì?

Tôi đã cố gắng như thế này:

import csv
from collections import namedtuple

with open('data_file.txt', mode="r") as infile:
    reader = csv.reader(infile)
    Data = namedtuple("Data", ", ".join(i for i in reader[0]))
    next(reader)
    for row in reader:
        data = Data(*row)

Đối tượng đầu đọc không thể đăng ký, vì vậy mã trên ném TypeError. Cách pythonic để đọc một tiêu đề tập tin vào một cái tên là gì?

Hướng dẫn python csv to namedtuple - python csv sang têntuple

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges286 bronze badges

Đã hỏi ngày 25 tháng 1 năm 2012 lúc 17:27Jan 25, 2012 at 17:27

Use:

Data = namedtuple("Data", next(reader))

và bỏ qua dòng:

next(reader)

Kết hợp điều này với phiên bản lặp lại dựa trên nhận xét của Martineau bên dưới, ví dụ trở thành cho Python 2

import csv
from collections import namedtuple
from itertools import imap

with open("data_file.txt", mode="rb") as infile:
    reader = csv.reader(infile)
    Data = namedtuple("Data", next(reader))  # get names from column headers
    for data in imap(Data._make, reader):
        print data.foo
        # ...further processing of a line...

Và cho Python 3

import csv
from collections import namedtuple

with open("data_file.txt", newline="") as infile:
    reader = csv.reader(infile)
    Data = namedtuple("Data", next(reader))  # get names from column headers
    for data in map(Data._make, reader):
        print(data.foo)
        # ...further processing of a line...

Đã trả lời ngày 25 tháng 1 năm 2012 lúc 17:30Jan 25, 2012 at 17:30

Sven Marnachsven MarnachSven Marnach

548K114 Huy hiệu vàng919 Huy hiệu bạc822 Huy hiệu Đồng114 gold badges919 silver badges822 bronze badges

11

Xin hãy xem

Data = namedtuple("Data", next(reader))
0. Về cơ bản, nó cung cấp khả năng lấy tên cột từ hàng đầu tiên khi bạn đang tìm kiếm và sau đó, cho phép bạn truy cập vào từng cột theo một hàng theo tên bằng cách sử dụng từ điển.

Nếu vì một lý do nào đó, bạn vẫn cần truy cập các hàng dưới dạng

Data = namedtuple("Data", next(reader))
1, thì thật dễ dàng để chuyển đổi từ điển thành các bộ dữ liệu được đặt tên như sau:

with open('data_file.txt') as infile:
    reader = csv.DictReader(infile)
    Data = collections.namedtuple('Data', reader.fieldnames)
    tuples = [Data(**row) for row in reader]

Đã trả lời ngày 25 tháng 1 năm 2012 lúc 18:05Jan 25, 2012 at 18:05

Jcolladojcolladojcollado

38.4K8 Huy hiệu vàng102 Huy hiệu bạc133 Huy hiệu đồng8 gold badges102 silver badges133 bronze badges

2

Tôi muốn đề xuất phương pháp này:

import csv
from collections import namedtuple

with open("data.csv", 'r') as f:
        reader = csv.reader(f, delimiter=',')
        Row = namedtuple('Row', next(reader))
        rows = [Row(*line) for line in reader]

Nếu bạn làm việc với gấu trúc, giải pháp càng trở nên thanh lịch hơn:

import pandas as pd
from collections import namedtuple

data = pd.read_csv("data.csv")
Row = namedtuple('Row', data.columns)
rows = [Row(*row) for index, row in data.iterrows()]

Trong cả hai trường hợp, bạn có thể tương tác với các bản ghi bằng tên trường:

for row in rows:
    print(row.foo)

Đã trả lời ngày 18 tháng 4 năm 2020 lúc 18:54Apr 18, 2020 at 18:54

RomanromanRoman

4112 Huy hiệu bạc10 Huy hiệu đồng2 silver badges10 bronze badges

1

Ví dụ Python đọc nội dung của tệp CSV sau đây và điền vào tên được đặt tên với tên & nbsp; aftersalesrecord. AfterSalesRecord.

# Ví dụ chương trình Python đọc các bản ghi từ tệp CSV

# và đưa chúng vào các trường hợp được đặt tên Python

Nhập bộ sưu tập như Coll

Nhập CSV

# Tạo một loại Tuple mới với tên AfterSalesRecord

SalesRecord = coll.namedTuple ('AfterSalesRecord', 'Make, Đơn vị, TotalUSD');

# Tạo đầu đọc CSV

csvreader & nbsp; & nbsp;= csv.Reader (mở ("car_aftersales.csv", "r"));

# Tạo tên được đặt tên cho mỗi bản ghi từ tệp CSV

in ("Nội dung của tệp CSV:");

Để bán hàng trong MAP (SalesRecord._Make, CSVREADER):

& nbsp; & nbsp; & nbsp;in (sales.make, sales.units, sales.totalusd);