zoukankan      html  css  js  c++  java
  • Python CSV文件处理/读写及With as 用法

    可以不使用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  , , and   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語句。例如:

    with FileReader('demo.py') as file:
        for line in file:
            print(line, end='')

    参考:http://www.pythonclub.org/python-files/csv

    http://docs.python.org/2/library/csv.html
  • 相关阅读:
    antd按需加载
    解决vscode开发react项目没有代码提示问题
    在react中配置less
    flutter之fluro导航传参数
    Flutter游戏:简单规则与结束页
    zsh: command not found:XXX
    React的安装与使用
    git stash 用法总结和注意点
    【OSS】工具类
    ajax将数组或list集合传到后台 的 【坑】
  • 原文地址:https://www.cnblogs.com/youxin/p/3153947.html
Copyright © 2011-2022 走看看