nối hàng mới vào python tập tin cũ


207

Tôi đang cố gắng thêm một hàng mới vào tệp csv cũ của mình. Về cơ bản, nó được cập nhật mỗi khi tôi chạy tập lệnh Python.

Ngay bây giờ tôi đang lưu trữ các giá trị hàng csv cũ trong một danh sách và sau đó xóa tệp csv và tạo lại nó với giá trị danh sách mới.

Muốn biết có cách nào tốt hơn để làm điều này.

Câu trả lời:


246
with open('document.csv','a') as fd:
    fd.write(myCsvRow)

Mở một tệp với 'a'tham số cho phép bạn nối vào cuối tệp thay vì chỉ ghi đè nội dung hiện có. Hãy thử điều đó.


2
Tôi đã thử fp = open (csv_filepathwithname, 'wa') wr = csv.writer (fp) somelist = [3,56,3,6,56] wr.writerow ((somelist)) nhưng chỉ hàng cuối cùng mới được thêm vào tập tin.
laspal

Phương pháp giả định rằng các mục được nối được phân tách bằng dấu phẩy, có thể không phải luôn luôn như vậy. Sau đó, phương thức ghi sẽ không duy trì dấu phân cách csv. Câu trả lời dưới đây mạnh mẽ hơn theo nghĩa đó.
sheth7

152

Tôi thích giải pháp này bằng cách sử dụng csvmô-đun từ thư viện chuẩn và withcâu lệnh để tránh mở tệp.

Điểm chính là sử dụng 'a'để nối thêm khi bạn mở tệp.

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

Nếu bạn đang sử dụng Python 2.7, bạn có thể gặp các dòng mới không cần thiết trong Windows. Tuy nhiên, bạn có thể cố gắng tránh chúng bằng cách sử dụng 'ab'thay vì 'a'điều này sẽ khiến bạn TypeError: một đối tượng giống như byte là bắt buộc, không phải là "str" ​​trong python và CSV trong Python 3.6. Việc thêm newline='', như Natacha gợi ý, sẽ khiến bạn không tương thích ngược giữa Python 2 và 3 .


24

Dựa trên câu trả lời của @GM và chú ý đến cảnh báo của @John La Rooy, tôi đã có thể nối thêm một hàng mới mở tệp trong 'a'chế độ.

Ngay cả trong các cửa sổ, để tránh vấn đề về dòng mới, bạn phải khai báo nó là newline=''.

Bây giờ bạn có thể mở tệp trong 'a'chế độ (không có b).

import csv

with open(r'names.csv', 'a', newline='') as csvfile:
    fieldnames = ['This','aNew']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writerow({'This':'is', 'aNew':'Row'})

Tôi đã không thử với nhà văn thông thường (không có Dict), nhưng tôi nghĩ rằng nó cũng sẽ ổn thôi.


12

Bạn có đang mở tệp với chế độ 'a' thay vì 'w' không?

Xem tập tin đọc và ghi trong tài liệu python

7.2. Đọc và viết tập tin

open () trả về một đối tượng tệp và được sử dụng phổ biến nhất với hai đối số: open (tên tệp, chế độ).

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>

Đối số đầu tiên là một chuỗi chứa tên tệp. Đối số thứ hai là một chuỗi khác chứa một vài ký tự mô tả cách thức sử dụng tệp. chế độ có thể là 'r' khi tệp sẽ chỉ được đọc, 'w' chỉ để ghi (một tệp hiện có cùng tên sẽ bị xóa) và 'a' mở tệp để nối thêm; bất kỳ dữ liệu nào được ghi vào tệp sẽ tự động được thêm vào cuối. 'r +' mở tệp cho cả đọc và viết. Đối số chế độ là tùy chọn; 'r' sẽ được giả sử nếu nó bị bỏ qua.

Trên Windows, 'b' được thêm vào chế độ sẽ mở tệp ở chế độ nhị phân, do đó, cũng có các chế độ như 'rb', 'wb' và 'r + b'. Python trên Windows phân biệt giữa các tệp văn bản và tệp nhị phân; các ký tự cuối dòng trong tệp văn bản sẽ tự động được thay đổi một chút khi dữ liệu được đọc hoặc ghi. Điều chỉnh hậu trường này đối với dữ liệu tệp là tốt đối với các tệp văn bản ASCII, nhưng nó sẽ làm hỏng dữ liệu nhị phân như trong các tệp JPEG hoặc EXE. Hãy thật cẩn thận khi sử dụng chế độ nhị phân khi đọc và ghi các tệp như vậy. Trên Unix, việc nối thêm 'b' vào chế độ sẽ không ảnh hưởng gì, vì vậy bạn có thể sử dụng nó độc lập với nền tảng cho tất cả các tệp nhị phân.


có thể bạn có thể làm cho câu trả lời của bạn chi tiết hơn, sau đó nó sẽ giống như một câu trả lời thực sự :-)
user702846

@user, tôi đã thêm một liên kết - điều đó có giúp gì cho bạn không?
John La Rooy

7

Nếu tệp tồn tại và chứa dữ liệu, thì có thể tự động tạo fieldnametham số csv.DictWriter:

# read header automatically
with open(myFile, "r") as f:
    reader = csv.reader(f)
    for header in reader:
        break

# add row to CSV file
with open(myFile, "a", newline='') as f:
    writer = csv.DictWriter(f, fieldnames=header)
    writer.writerow(myDict)

6
# I like using the codecs opening in a with 
field_names = ['latitude', 'longitude', 'date', 'user', 'text']
with codecs.open(filename,"ab", encoding='utf-8') as logfile:
    logger = csv.DictWriter(logfile, fieldnames=field_names)
    logger.writeheader()

# some more code stuff 

    for video in aList:
        video_result = {}                                     
        video_result['date'] = video['snippet']['publishedAt']
        video_result['user'] = video['id']
        video_result['text'] = video['snippet']['description'].encode('utf8')
        logger.writerow(video_result) 

1
Vui lòng sửa vết lõm của bạn. Câu trả lời cũng được hưởng lợi từ một lời giải thích - và những câu trả lời này cũng thu hút nhiều người ủng hộ hơn.
Ông T

Đây là một số mã đơn giản, nó mở tệp cho chế độ chắp thêm, viết ra một tiêu đề rec và sau đó hoạt động thông qua các bản ghi video trong aList.
markkaufman

2

Tôi làm theo cách này để nối một dòng mới trong tệp .csv:

pose_x = 1 
pose_y = 2

with open('path-to-your-csv-file.csv', mode='a') as file_:
    file_.write("{},{}".format(pose_x, pose_y))
    file_.write("\n")
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.