實際工作中,碰到這麼個問題:有個軟體跑在linux系統上,其中用到乙個資料庫是csv格式的,但要向這個資料庫新增600行新的資料,資料來源同樣是乙個csv格式的檔案。
有了目標,開始幹活。首先想到的是,把linux系統上的資料表給down下來,用excel開啟。想法很豐滿,現實很骨感。悲催的是,excel的表單儲存成csv格式的檔案後,原來新增的改動全部沒了,而且裡面的資料發生了很大的變動,有一列全部變成一樣的值了。
看來用excel儲存為csv格式的檔案是行不通的。
無奈之下,想到了python。所幸python早已有支援csv讀寫的模組,用起來也甚是方便。
python程式如下:
importcsvfobj=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...