Python CSV文件处理/读写及With as 用法
2013-06-24 23:47 youxin 阅读(5732) 评论(0) 编辑 收藏 举报可以不使用CSV模块
逐行处理:
for line in open("samples/sample.csv"): title, year, director = line.split(",") print year, title
使用CSV:
import csv reader = csv.reader(open("samples/sample.csv")) for title, year, director in reader: print year, title
将数据存为csv格式:
import csv import sys data = [ ("And Now For Something Completely Different", 1971, "Ian MacNaughton"), ("Monty Python And The Holy Grail", 1975, "Terry Gilliam, Terry Jones"), ("Monty Python's Life Of Brian", 1979, "Terry Jones"), ("Monty Python Live At The Hollywood Bowl", 1982, "Terry Hughes"), ("Monty Python's The Meaning Of Life", 1983, "Terry Jones") ] writer = csv.writer(sys.stdout) for item in data: writer.writerow(item)
怎么获取csv reader 对象的len?
参考:http://stackoverflow.com/questions/2890549/number-of-lines-in-csv-dictreader
csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
I've gotten used to generating CSV (comma separated value) files in Python for these folks. Ever so often, someone sends me a CSV file they have created via Excel. Invariably, I will get the following error when trying to read that file with Python:
_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
This is annoying, but the solution to the problem is to open the file with universal newline mode enabled. This means using the mode 'U'
or 'rU'
in your open()
function call. For example:
reader = csv.reader(open("data.csv", 'rU'), dialect='excel')
According to the open()
documentation, universal newline mode accepts \n
,\r
, and \r\n
as valid newline characters.
python with用法:
with是python2.5以后才有的,它实质是一个控制流语句,with可以用来简化try-finally语句。它的主要用法是实现一个类__enter__()和__exit__()方法,基本形式如下
class controlled_execution: def _enter__(self): set things up return thing def __exit__(self, type, value, traceback): tear thing down with controlled_execution() as thing: some code
在实际的运行过程中,python会首先运行enter里的代码,返回thing,作为as 后面的变量值,然后再运行with模块中的代码,最后会自动执行exit中的代码,而不管with中的代码运行结果如何。这也就是with能简化try-finally语句的原因。所以with通常用在读取文件的操作中,将文件句柄的关闭操作放在exit方法中,这样就不会因忘记释放文件句柄而产生可能出现的错误。
另外,exit()方法的返回值可以用来指示with部分的代码出现的异常是否需要raise,如果返回false,则会raise,否则,不进行任何操作。
在 try、raise 陳述句 中有個讀取檔案的範例:
file = open('demo.py', 'r', encoding='UTF-8')
try:
for line in file:
print(line, end='')
except:
print('讀取檔案發生錯誤')
finally:
file.close()
為了要處理檔案讀取過程中發生的例外,並且最後確定檔案一定會關閉,你使用了try..except...finally語句,實際上,在Python 3(或2.6)中,你可以使用with as語句來簡化程式的撰寫:
with open('demo.py', 'r', encoding='UTF-8') as file:
for line in file:
print(line, end='')
with之後的運算式傳回的物件,可以使用as指定給變數來參考,在上面的例子中,file所參考到的物件,最後會被自動關閉,即使在with as的區塊中發生了例外,最後一定會關閉file所參考的物件。
實際上,只要物件支援環境管理協定(Context Management Protocol),就可以使用with as語句。支援環境管理協定的物件,必須實作__enter__()與__exit__()兩個方法,這樣的物件稱之為環境管理員(Context Manager)。
with陳述句一開始執行,就會進行__enter__()方法,該方法傳回的物件,可以使用as指定給變數(如果有的話),接著就執行with區塊中的程式碼。
如果with區塊中的程式碼發生了例外,則會執行__exit__()方法,並傳入三個引數,這三個引數,與 再看 try、raise 中所提到的 sys.exc_info() 傳回的三個值是相同的,也就是例外的類型、例 外訊息以及traceback物件。此時__exit__()方法若傳回False,則例外會被重新丟出,否則例外就停止傳播,通常__exit__()會傳回False以在with之外還可以處理例外。
如果with區塊中沒有發生例外而執行完畢,則也是執行__exit__()方法,此時__exit__()的三個參數都接收到None。
所以,假設你要自行實作一個可以自動關閉檔案的物件,則可以如下:
class FileReader:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.file = open(self.filename, 'r', encoding='UTF-8')
return self.file
def __exit__(self, type, msg, traceback):
if type:
print(msg) # 作你的例外處理
self.file.close()
return False
接下來你就可以在FileReader物件上使用with as語句。例如:
for line in file:
print(line, end='')
参考:http://www.pythonclub.org/python-files/csv
http://docs.python.org/2/library/csv.html