Thêm tiêu đề vào tệp csv một cách khéo léo


84

Tôi đã viết một tập lệnh Python hợp nhất hai tệp csv và bây giờ tôi muốn thêm tiêu đề vào csv cuối cùng. Tôi thử làm theo các gợi ý báo cáo ở đây và tôi đã nhận được lỗi sau: expected string, float found. Cách khắc phục điều này đáng lo ngại nhất là gì?

Đây là mã tôi đang sử dụng:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

bạn đang ghi bao nhiêu cột vào tệp csv của mình? Bạn có thể vui lòng nêu rõ trong câu hỏi của mình 1. định dạng đầu vào của tệp của bạn 2. định dạng đầu ra
nio

@nio: Một phần lớn mã được đăng là từ câu hỏi trước của OP
Martijn Pieters

Câu trả lời:


115

Các DictWriter()lớp học hy vọng bộ từ điển cho mỗi hàng. Nếu tất cả những gì bạn muốn làm là viết một tiêu đề ban đầu, hãy sử dụng một thông thường csv.writer()và chuyển vào một hàng đơn giản cho tiêu đề:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.writer(outcsv)
    writer.writerow(["Date", "temperature 1", "Temperature 2"])

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

Cách thay thế sẽ là tạo từ điển khi sao chép dữ liệu của bạn:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': row[1], 'temperature 2': 0.0} for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': 0.0, 'temperature 2': row[1]} for row in reader)

1
Tại sao các tệp được mở ở chế độ nhị phân? Các tệp csv rõ ràng là văn bản, không phải định dạng nhị phân. Điều này có thể gây ra sự cố trên hệ thống Windows.
pcarter

3
@pcarter: Trên Python 2, việc mở tệp ở chế độ văn bản trên Windows sẽ kích hoạt các bản dịch dòng mới không tương thích với định dạng CSV; các csvmô-đun như vậy, muốn xử lý dòng mới trực tiếp (sử dụng \n\r\nkhi cần thiết), mà có nghĩa là bạn phải mở file trong chế độ nhị phân. Xem csv.reader()tài liệu : Nếu csvfile là một đối tượng tệp, nó phải được mở bằng cờ 'b' trên các nền tảng tạo ra sự khác biệt. . Trên Python 3, bạn sẽ sử dụng newline=''tùy chọn thay thế.
Martijn Pieters

Điều này hoạt động, điều buồn cười: khi tệp được mở ở achế độ, writer.writeheader()sẽ ghi lại tiêu đề hai lần mặc dù hàng tiêu đề đã được viết rồi!
loretoparisi

2
@loretoparisi: tất nhiên rồi. Không sử dụng writer.writeheader()khi thêm vào một tệp hiện có. Đối csv.writer()tượng không thể phát hiện ra rằng bạn đang ghi dữ liệu vào một tệp hiện có.
Martijn Pieters

Trong Python 3, cần mở tệp với tùy chọn 'w', nhị phân sẽ không hoạt động. Sẽ rất hữu ích nếu đề cập điều này trong câu trả lời. Tôi tìm thấy sự khác biệt này ở đây: stackoverflow.com/questions/34283178/...
Kristóf

6

Bạn chỉ cần thêm một hàng bổ sung trước khi thực hiện vòng lặp. Hàng này chứa tên tiêu đề tệp CSV của bạn.

schema = ['a','b','c','b']
row = 4
generators = ['A','B','C','D']
with open('test.csv','wb') as csvfile:    
     writer = csv.writer(csvfile, delimiter=delimiter)
# Gives the header name row into csv
     writer.writerow([g for g in schema])   
#Data add in csv file       
     for x in xrange(rows):
         writer.writerow([g() for g in generators])

3

Điều này đã làm việc cho tôi.

header = ['row1', 'row2', 'row3']
some_list = [1, 2, 3]
with open('test.csv', 'wt', newline ='') as file:
    writer = csv.writer(file, delimiter=',')
    writer.writerow(i for i in header)
    for j in some_list:
        writer.writerow(j)
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.