簡體   English   中英

更改/寫入單個值到csv文件python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM