[英]change/writing single value to csv file python
我的代碼有錯誤:
_csv.Error: sequence expected
我相信這是因為我試圖只寫一個值而不是列表等。
exRtFile = open ('exchangeRate.csv')
exchReader = csv.reader(exRtFile)
exchWriter = csv.writer(exRtFile)
loop2=0
while loop2==0:
selected=int(input("Please select an option: "))
if selected == 1:
change = input("What rate would you like to change: ")
changeRt = float(input("What would you like to change the rate to: "))
for row in exchReader:
currency = row[0]
if currency == change:
crntRt = row[1]
crntRt = changeRt
exchWriter.writerow(crntRt)
exRtFile.close()
解決此問題的最佳方法是什么,或者有沒有更好的方法來更改CSV文件中的值?
CSV文件:
Pound Sterling,1
Euro,1.22
US Dollar,1.67
Japanese Yen,169.948
這是一些未經測試的代碼,可以滿足您的要求。 想法是將文本讀入內存,應用更新,然后將結果寫到原始文件上。
您可以進一步增強此功能,詢問用戶是否要保存其更改,並添加新的幣種,而不僅僅是告訴用戶不知道它們。
在現實世界中,我會將這段代碼分為三個獨立的函數(甚至是類),一個用於讀取,一個用於編寫,以及一個用於編輯列表。
import csv
rates = {}
# read file into dictionary
with open('csv_file.csv', 'r') as in_file:
rdr = csv.reader(in_file)
for item in reader:
rates[row[0]] = row[1]
# ask user for updates and apply to dictionary
while true:
cmd = raw_input('Enter exchange rate to adjust, or blank to exit')
if cmd is None or cmd.strip() == '':
break
if rates.has_key(cmd):
new_rate = float(raw_input('Enter new exchange rate:'))
rates[cmd] = new_rate
else:
print 'Currency {} is not known.'.format(cmd)
# Write the updated dictionary back over the same file.
with open('csv_file.csv', 'w') as out_file:
wrtr = csv_writer(out_file)
wrtr.writerows(rates)
回答您的問題:是的,問題是您試圖只寫一個值,而writerow
需要一個列表。
就是說...您會考慮改變代碼的工作方式嗎?
這是我所做的(我已經測試過了,所以我知道它可以工作):
dict
,其中鍵是貨幣名稱(例如, 歐元 ),值是新的貨幣值(例如, 5.0 )。循環按下0
exchangeRate.csv
文件。 如果row[0]
(貨幣名稱)在要更改的值中,則在該行中對其進行更改。 exchangeRate.csv.tmp
exchangeRate.csv.tmp
,其中某些行未更改,而某些行已更改。 交換(移動) .tmp
文件到exchangeRate.csv
鄧諾...也許太大的改變? 無論如何,這里是:
import csv
import shutil
change_rates = {}
selected = 1
while selected:
selected=int(raw_input("Please select an option: (1 to change, 0 to exit)"))
if selected == 1:
change = raw_input("What rate would you like to change?: ")
changeRt = float(raw_input("What would you like to change the rate to: "))
change_rates[change] = changeRt
if len(change_rates) > 0:
with open('exchangeRate.csv', 'r') as f_in,\
open('exchangeRate.csv.tmp', 'w') as f_out:
exchReader = csv.reader(f_in)
exchWriter = csv.writer(f_out)
for row in exchReader:
if row[0] in change_rates:
row[1] = change_rates[row[0]]
exchWriter.writerow(row)
shutil.move('exchangeRate.csv.tmp', 'exchangeRate.csv')
下面是一個示例執行:
Please select an option: (1 to change, 0 to exit)1
What rate would you like to change?: Euro
What would you like to change the rate to: 5
Please select an option: (1 to change, 0 to exit)0
borrajax@borrajax:~/Documents/Tests$ cat ./exchangeRate.csv
Pound Sterling,1
Euro,5.0
US Dollar,1.67
Japanese Yen,169.948
您始終可以進行更多優化,例如...允許不區分大小寫的搜索,或者檢查貨幣是否已實際更改(例如,即使用戶說他想將貨幣Euro更改為5.0 ,如果那是歐元的匯率)然后什么也不要做)...類似的事情。
編輯1 :
我剛剛看過Larry Lustig的回答,並且我同意對於小型文件,因為這似乎是您的情況(可以完全加載到內存中的文件),因此對發布的磁盤進行連續讀取和寫入並不是最佳選擇。 他的想法是將所有內容保留在內存中,然后批量寫入同一exchangeRate.csv
文件,這可能更適合您的需求。
編輯2 :
在對此答案的評論中回答您的問題:
.tmp在末尾做什么:exchangeRate.csv.tmp:
這只是一個新名字。 我添加后綴.tmp
以避免與原始文件(exchangeRate.csv)命名沖突。 您可以foobar.baz
命名,甚至可以命名為foobar.baz
。
變量中“更改”的目的是什么:change_rates [change] = changeRt:
change
是一個包含要更改的貨幣名稱的變量(在我發布的用法示例中, change
包含字符串"Euro"
,因為這是用戶(erm ... me)在控制台上鍵入的內容。訪問dict的方式 。
以下是“ [row [0]]”的用途:row1 = change_rates [row [0]]。
我們同意在讀取文件時, row[0]
(正像這樣,不是[row[0]]
)包含文件中貨幣的名稱( 歐元,英鎊...等),對嗎? 因此,在執行的某一點上row[0]
將包含字符串"Euro"
(在我的測試示例中)是用戶想要更改的貨幣。 該字符串( "Euro"
)也是change_rates
詞典中的鍵(因為用戶說他想更改它),因此您要在change_rates
詞典中使用鍵 "Euro"
查詢項目的值 (這將給您5.0
)。 正在做change_rates["Euro"]
要更清楚一點,將行print "Currencies to change: %s" % change_rates
if len(change_rates) > 0:
在右上一行print "Currencies to change: %s" % change_rates
if len(change_rates) > 0:
這將向您顯示字典的樣子)
shutil.move('exchangeRate.csv.tmp','exchangeRate.csv')有什么作用?
它將具有新幣種的文件復制到exchangeRate.csv
(請參見shutil文檔 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.