python處理csv檔案問題解決貼

2022-05-04 05:12:09 字數 1917 閱讀 6064

實際工作中,碰到這麼個問題:有個軟體跑在linux系統上,其中用到乙個資料庫是csv格式的,但要向這個資料庫新增600行新的資料,資料來源同樣是乙個csv格式的檔案。

有了目標,開始幹活。首先想到的是,把linux系統上的資料表給down下來,用excel開啟。想法很豐滿,現實很骨感。悲催的是,excel的表單儲存成csv格式的檔案後,原來新增的改動全部沒了,而且裡面的資料發生了很大的變動,有一列全部變成一樣的值了。

看來用excel儲存為csv格式的檔案是行不通的。

無奈之下,想到了python。所幸python早已有支援csv讀寫的模組,用起來也甚是方便。

python程式如下:

import

csvfobj=open('

test.csv

','r')

csvreader=csv.reader(fobj)

sheet=

for row in

csvreader:

fobj.close

writefileobj=open('

result.csv

','a')

write=csv.writer(writefileobj)

for row in sheet[40003:]:

writer.writerow(row)

writefileobj.close()

這裡寫檔案的格式要用a,表示追加寫入,會保留檔案內容,將新資料新增到檔案末尾,如果使用的是'w'方式,則會清除原有的檔案內容。

1 1. 在windows下的文字檔案的每一行結尾,都有乙個回車('

\n')和換行('\r'

) 2 2. 在linux下的文字檔案的每一行結尾,只有乙個回車('\n'

); 3 3. 在mac下的文字檔案的每一行結尾,只有乙個換行('

\r');

因此,在linux開啟在windows下編輯過的文字,會在行末顯示^m

^m在linux中對應的輸入是ctrl+v,ctrl+m。

解決辦法也很多樣化,個人試過比較好用的方法是用文字替代的方法。使用vim開啟csv檔案,輸入esc+:,在輸入狀態輸入:

%s/^m$//g

解釋:% 指匹配整個檔案,s 是置換的意思,^m 注意要用 ctrl + v ctrl + m 來輸入,m 後面的 $ 代表匹配行尾的內容,最後的 g 則表示每行中匹配到的內容都要置換;

讀檔案 進行讀檔案操作時,直到讀到文件結束符(eof)才算讀取到檔案最後,python會認為位元組\x1a(26)轉換成的字元為文件結束符(eof),

故使用'r

'進行讀取二進位制檔案時,可能會出現文件讀取不全的現象。

示例: 二進位制檔案中存在如下從低位向高位排列的資料:7f 32 1a 2f 3d 2c 12 2e 76如果使用'r

'進行讀取,則讀到第三個位元組,即認為檔案結束。

如果使用'rb

'按照二進位制位進行讀取的,不會將讀取的位元組轉換成字元,從而避免了上面的錯誤。

解決方案:

二進位制檔案就用二進位制方法讀取'rb

'總結:

使用'r

'的時候,如果碰到'

0x1a

',就視為檔案結束,就是eof。使用'

rb'則不存在這個問題

於是把**中的檔案開啟方式由'r'變成了'rb『,寫入同樣由'a』變成了'ab',執行python,結果報錯:

iterator should return strings, not bytes (did you open the file in text mode?)

重新把新的資料上傳到linux裝置上,軟體可以正常執行。

乙個小小的csv檔案處理,竟然遇到這麼多波折,最後不屈不撓地解決了,也是不容易。謹以此文mark一下。

Python處理csv檔案

在csv檔案中,以,作為分隔符,分隔兩個單元格。像這樣a,c表示單元格a和單元格c之間有個空白的單元格。依此類推。不是每個逗號都表示單元格之間的分界。所以即使csv是純文字檔案,也堅持使用專門的模組進行處理。python內建了csv模組。先看看乙個簡單的例子。import csv filename ...

用Python處理csv檔案

csv 是 逗號分隔值 的英文縮寫,通常都是純文字檔案。建議使用 wordpad 或是記事本 note 來開啟,再則先另存新檔後用 excel 開啟,也是方法之一。一直以為 csv 是某種 excel 檔案,原來是一種純文字檔案,嘗試用記事本開啟乙個 csv 檔案 果然,在記事本中是以逗號為分隔符,...

利用Python處理CSV 檔案

csv 檔案 將資料作為一系列以逗號分隔的值寫入檔案,通俗的講就是兩個逗號的資訊之間看作乙個資料。csv模組包含在python標準庫中,可用於分析csv檔案中的資料行 import csv 利用matplotlib繪圖 from matplotlib import pyplot as plt fil...