2012-06-14 31 views
13

Tôi cần cách thay đổi giá trị cụ thể của cột tệp csv. Ví dụ: tôi có tệp csv:Thay đổi giá trị cụ thể trong tệp CSV qua Python

"Ip","Sites" 
"127.0.0.1",10 
"127.0.0.2",23 
"127.0.0.3",50 

và tôi cần thay đổi giá trị 23-30 trong "127.0.0.2".

Tôi sử dụng thư viện csv: nhập csv

Đánh giá cao sự trợ giúp khi tôi mới sử dụng Python. Cảm ơn!

+0

Vì vậy, tôi có thể đọc từ file csv và ghi vào tập tin csv, nhưng tôi không có một ý tưởng làm thế nào để giá trị trong tập tin hiện có repace ... – ihorko

+0

bạn có thể đăng bài đọc/ghi mã mà bạn đã có? Tại một số điểm, bạn nên có dữ liệu trong Python và bạn có thể sửa đổi nó ở đó trước khi viết. –

Trả lời

26

Đây là giải pháp mở tệp csv, thay đổi giá trị trong bộ nhớ và sau đó ghi lại các thay đổi vào đĩa.

r = csv.reader(open('/tmp/test.csv')) # Here your csv file 
lines = list(r) 

Nội dung của dòng:

[['Ip', 'Sites'], 
['127.0.0.1', '10'], 
['127.0.0.2', '23'], 
['127.0.0.3', '50']] 

Sửa đổi các giá trị:

lines[2][1] = '30' 

Nội dung của dòng:

[['Ip', 'Sites'], 
['127.0.0.1', '10'], 
['127.0.0.2', '30'], 
['127.0.0.3', '50']] 

Bây giờ chúng ta chỉ phải viết nó trở lại một file

writer = csv.writer(open('/tmp/output.csv', 'w')) 
writer.writerows(lines) 
+1

Nếu bạn gặp sự cố dòng kép trên csv được viết, bạn có thể thử mở tệp dưới dạng nhị phân: 'writer = csv.writer (mở ('/ tmp/output.csv', 'wb'))' – Nitay

+0

Bạn có phải đóng người viết không? – pekasus

+0

Bạn nên đóng bộ mô tả tệp chứ không phải trình ghi. Bạn có thể sử dụng "với" để quản lý tệp –

10

Bạn không thể thay thế giá trị trong tệp hiện có. Thay vào đó, bạn cần phải:

  1. đọc trong tập tin hiện có
  2. tập tin ALTER trong bộ nhớ
  3. viết ra tập tin mới (ghi đè lên tập tin hiện có)

gì bạn cũng có thể làm là đọc trong dòng tệp hiện có theo dòng, viết nó ra một tệp mới, trong khi thay thế các giá trị khi đang di chuyển. Khi hoàn tất, đóng cả hai tệp, xóa tệp gốc và đổi tên tệp mới.

4

Bạn có thể sử dụng thư viện rất mạnh được gọi là gấu trúc. Đây là ví dụ.

import pandas as pd 
df = pd.read_csv("test.csv") 
df.head(3) #prints 3 heading rows 

Output:

Ip Sites 
0 127.0.0.1 10 
1 127.0.0.2 23 
2 127.0.0.3 50 

Bây giờ nếu bạn muốn thay đổi các giá trị trong cột 'Trang web' ở hàng 1, chạy:

df.set_value(1, "Sites", 30) 

Nếu bạn muốn thay đổi tất cả các giá trị, trong đó 'Ip' bằng 127.0.0.2, chạy:

df.loc[df["Ip"]=="127.0.0.2", "Sites"] = 30 

Cuối cùng, để lưu các giá trị:

df.to_csv("test.csv", index=False) 
Các vấn đề liên quan