zoukankan      html  css  js  c++  java
  • 用python处理文本,本地文件系统以及使用数据库的知识基础

    主要是想通过python之流的脚本语言来进行文件系统的遍历,处理文本以及使用简易数据库的操作。

    本文基于陈皓的:《程序员技术练级攻略》

    一.Python csv

    对于电子表格和数据库导出文件,比较常见的文件格式是.csv,所以python中的csv模块也是一个比较重要的模块。下面介绍csv常用的方法。

    1.csv.reader(csvfile, dialect='excel', **fmtparams)

    • 该函数返回一个reader对象,能够以行遍历的形式遍历行里面的数据。
    • csvfile——需要是支持迭代(Iterator)的对象,并且每次调用next方法的返回值是字符串(string),通常的文件(file)对象,或者列表(list)对象都是适用的,如果是文件对象,打开是需要加"b"标志参数。
    • dialect——编码风格,默认为excel方式,也就是逗号(,)分隔,另外csv模块也支持excel-tab风格,也就是制表符(tab)分隔。其它的方式需要自己 定义,然后可以调用register_dialect方法来注册,以及list_dialects方法来查询已注册的所有编码风格列表。
    • fmtparams——格式化参数,用来覆盖之前dialect对象指定的编码风格

    看一下示例:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import csv
    
    #定义一个字符串
    st = "I am a student."
    #定义列表,注意csv只接受以ACSII编码的字符串序列
    li = [1,2,3,4,5]  #不符合要求
    lis = ['a','b','c']
    
    reader1 = csv.reader(st)
    for line in reader1:
        print line,   #['I'] [' '] ['a'] ['m'] [' '] ['a'] [' '] ['s'] ['t'] ['u'] ['d'] ['e'] ['n'] ['t'] ['.']
    
    print '
    '+str(reader1.line_num)   #输出行数
    
    reader2 = csv.reader(lis)
    for line in reader2:
        print line,
    
    #打开文件对象
    with open ('./egg.csv','rb') as csvfile:
        reader3 = csv.reader(csvfile)
        for row in reader3:
            print row,

    对于每个line或row支持next,dialectfieldnamesline_num方法。

    2.csv.writer(csvfile, dialect='excel', **fmtparams)

    参数表同上,注意在建立了writer对象之后,要通过writerow写入一行,而通过writerows写入多行。

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import csv
    
    #注:with语句有两个作用:1.关闭文件句柄;2.更好的处理异常
    with open('./egg.csv','wb') as csvfile:  #注:w是重新覆盖,a是直接追加 
        writer = csv.writer(csvfile)
        writer.writerow(['姓名','年龄','电话'])
        data = [('何辉宇','21','1234'),('何辉宁','21','5678')]
        writer.writerows(data)

    3.dialect

    csv 模組巧妙地運用 dialect 的概念,將不同應用程式對 CSV 處理方式上的差異隱藏起來。

    這裡的差異指的是欄位分隔字元(delimiter)跟識別資料內容的引號(quoting character)等。目前 csv 模組內建兩種 dialect - excel (.csv) 及 excel-tab (.tsv),可以用來讀取 Excel 寫出、或是寫出 Excel 可以讀取的檔案格式,而不用去管 Excel 慣用的格式為何。

    4.class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

    跟reader差不多,只不过是以字典形式呈现。

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import csv
    
    with open('./egg.csv','rb') as csvfile:
        reader = csv.DictReader(csvfile)
        for line in reader:
            print line,

    结果:

    dzhwen@deng:~/python文件/csv$ python dictreader.py
    {'xe7x94xb5xe8xafx9d': '1234', 'xe5xb9xb4xe9xbex84': '21', 'xe5xa7x93xe5x90x8d': 'xe4xbdx95xe8xbex89xe5xaex87'} {'xe7x94xb5xe8xafx9d': '5678', 'xe5xb9xb4xe9xbex84': '21', 'xe5xa7x93xe5x90x8d': 'xe4xbdx95xe8xbex89xe5xaex81'}

    5.class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

    与之类似。

    二.Python open

    1.内建函数open()

    file_object = open(file_name,access_mode = 'r',buffering = -1)

    文件对象的访问模式:

    • r——读方式
    • w——写方式
    • a——追加模式
    • r+,w+,a+——以读写模式打开
    • rb,wb,ab——以二进制模式读写追加
    • rb+,wb+,ab+——以二进制读写模式打开

    2.工厂函数file()

    open()和file()函数具有相同的功能,可以任意替换。您所看到任何使用open()的地方,都可以使用file()替换它。

    3.输入/输出

    read(size),readline(),readlines(),write()

    4.文件内移动

    • file.seek(off,whence=0)——在文件中移动文件指针,从whence(0代表文件起始,1代表当前位置,2代表文件末尾)偏移off字节。
    • file.tell()——返回当前在文件中的位置

    5.文件迭代

    for eachLine in f:

      pass

    6.其他

    • file.close() —— 关闭文件
    • file.fileno() —— 返回文件的描述符(file descriptor,FD,整型值)
    • file.flush() —— 直接把内部缓冲区中的数据立刻写入文件,而不是被动地等待输出缓冲区被写入。

    三.Python sys

    sys模块中的函数非常多,挑几个有用的来讲讲。

    1.sys.argv —— 对命令行参数的访问

    • sys.argv是命令行参数的列表
    • len(sys.argv) 是命令行参数个数(也就是argc)

    2.sys.platform() —— 输出平台信息

    >>> import sys
    >>> sys.platform
    'linux2'

    实现一个清除终端,linux下用clear,windows下用cls

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import sys
    
    ostype = sys.platform()
    if ostype == "linux" or ostype == "linux2":
        cmd = "clear"
    else:
        cmd = "cls"

    3.sys.exit(n) 

    执行至主程序的末尾时,解释器会自动退出. 但是如果需要中途退出程序, 你可以调用sys.exit 函数, 它带有一个可选的整数参数返回给调用它的程序. 这意味着你可以在主程序中捕获对sys.exit 的调用。(注:0是正常退出,其他为不正常,可抛异常事件供捕获!)(相当与C++的return函数)

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import sys
    
    def exitfunc(value):
        print value
        sys.exit(0)
    
    print "hello"
    
    try:
        sys.exit(1)
    except SystemExit,value:
        exitfunc(value)
    
    print "come?

    4.sys.path —— 与程序有关的执行路径

    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python2.7/dist-packages/tornado-1.2.1-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/uWSGI-2.0.3-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/python_memcached-1.53-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/protobuf-2.5.0-py2.7.egg', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']

    添加模块路径:

    sys.path.append(“mine module path”).

    5.sys.modules —— python的所有模块

    使用方法:

    >>> sys.modules

    常用方法:

    for names in sys.modules.keys():
    if names != ’sys’:
        pass

    5.sys.stdin,stdout,stderr —— 标准输入输出,错误输出

    标准输入和标准错误 (通常缩写为 stdoutstderr) 是内建在每一个 UNIX 系统中的管道。

    当你 print 某些东西时,结果前往 stdout 管道;

    当你的程序崩溃并打印出调试信息 (例如 Python 中的 traceback (错误跟踪)) 的时候,信息前往 stderr 管道。

    • stdout 是一个类文件对象;调用它的 write 函数可以打印出你给定的任何字符串。
    • 实际上,这就是 print 函数真正做的事情;它在你打印的字符串后面加上一个硬回车,然后调用 sys.stdout.write 函数。在最简单的例子中,stdoutstderr 把它们的输出发送到相同的地方。
    • stdout 一样,stderr 并不为你添加硬回车;如果需要,要自己加上。
    • stdoutstderr 都是类文件对象,但是它们都是只写的。它们都没有 read 方法,只有 write 方法。然而,它们仍然是类文件对象,因此你可以将其它任何 (类) 文件对象赋值给它们来重定向其输出。

    >>> import sys
    >>> for i in range(3):
    ...     print 'Hello!'
    ... 
    Hello!
    Hello!
    Hello!
    >>> for i in range(3):
    ...     sys.stdout.write('Hello!')
    ... 
    Hello!Hello!Hello! 
    >>> for i in range(3):
    ...     sys.stderr.write('Hello!')
    ... 
    Hello!Hello!Hello!

    使用sys重定向输出

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import sys
    
    print 'Dive in'        # 标准输出
    saveout = sys.stdout        # 终在重定向前保存stdout,这样的话之后你还可以将其设回正常
    fsock = open('out.log', 'w')      # 打开一个新文件用于写入。如果文件不存在,将会被创建。如果文件存在,将被覆盖。
    sys.stdout = fsock                 # 所有后续的输出都会被重定向到刚才打开的新文件上。
    print  'This message will be logged instead of displayed'    # 这样只会将输出结果“打印”到日志文件中;屏幕上不会看到输出
    sys.stdout = saveout   # 在我们将 stdout 搞乱之前,让我们把它设回原来的方式。     
    fsock.close()     # 关闭日志文件。

    使用sys.stdin读取

    >>> r = sys.stdin.readline()
    sasasa
    >>> r
    'sasasa
    '

    重定向错误信息

    fsock = open('error.log', 'w')           # 打开你要存储调试信息的日志文件。 
    sys.stderr = fsock                           # 将新打开的日志文件的文件对象赋值给stderr以重定向标准错误。
    raise Exception, 'this error will be logged'   # 引发一个异常,没有在屏幕上打印出任何东西,所有正常的跟踪信息已经写进error.log
    #还要注意你既没有显式关闭日志文件,也没有将 stderr 设回最初的值。
    #这样挺好,因为一旦程序崩溃 (由于引发的异常),Python 将替我们清理并关闭文件

    打印到 stderr——向标准错误写入错误信息是很常见的,所以有一种较快的语法可以立刻导出信息

    >>> print 'entering function'
    entering function
    >>> import sys
    >>> print >> sys.stderr, 'entering function'
    
    entering function 

    print 语句的快捷语法可以用于写入任何打开的文件 (或者是类文件对象)。

    在这里,你可以将单个print语句重定向到stderr而且不用影响后面的print语句。

    四.Python os,path

    os 模块的文件/目录访问函数

    文件处理

    • mkfifo()/mknod() —— 创建命名管道/创建文件系统节点
    • remove()/unlink() —— 删除文件
    • rename()/renames() —— 重命名文件
    • stat() —— 返回文件信息
    • symlink() —— 创建符号链接
    • utime() —— 更新时间戳
    • tmpfile() —— 创建并打开('w'+'b')一个新的临时文件
    • walk() —— 生成一个目录树下的所有文件名

    目录/文件夹

    • chdir() —— 改变当前工作目录
    • chroot() —— 改变当前进程的根目录
    • listdir() —— 列出指定目录的文件
    • getcwd() —— 返回当前工作目录
    • mkdir()/makedirs() —— 创建目录/创建多层目录
    • rmdir()/removedirs() —— 删除目录/删除多层目录

     访问/权限

    • access() —— 检验权限模式
    • chmod() —— 改变权限模式
    • chown() —— 改变owner和GID,但不会跟踪链接
    • umask() —— 设置默认权限模式

    文件描述符操作

    • open() —— 打开文件
    • read() / write() —— 读取/写入文件

    os.path 模块的文件/目录访问函数

    分隔

    • basename() —— 去掉目录路径,返回文件名
    • dirname() —— 去掉文件名,返回目录路径
    • join() —— 将分离的各部分组合成一个路径名
    • split() —— 返回(dirname(),basename())元组
    • splitdrive() —— 返回(drivename,pathname)元组
    • splitext —— 返回(filename,extension)元组

    信息

    • getatime() —— 返回最近访问时间
    • getctime() —— 返回文件创建时间
    • getmtime() —— 返回最近文件修改时间
    • getsize() —— 返回文件大小(以字节为单位)

    查询

    • exists() —— 指定路径(文件或目录)是否存在
    • isabs() —— 指定路径是否为绝对路径
    • isdir() —— 指定路径是否存在且为一个目录
    • isfile() —— 指定路径是否存在且为一个文件
    • islink() —— 指定路径是否存在且为一个符号链接
    • ismount —— 指定路径是否存在且为一个挂载点
    • samefile —— 两个路径名是否指向同一个文件

    五.Python sqlite

    Sqllite是一个小巧的内嵌型数据库,也就是说没有独立的维护进程。

    1.导入模块

    >>> import sqlite3

    2. 创建/打开数据库

    可以打开数据库:

    cx = sqlite3.connect('./test.db')

    也可以存在内存当中:

    con = sqlite3.connect(":memory:")

    3.数据库连接对象

    打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:

    1. commit()--事务提交   
    2. rollback()--事务回滚   
    3. close()--关闭一个数据库连接   
    4. cursor()--创建一个游标

    关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。

    4.使用游标查询数据库
    定义游标:
    cu = cx.cursor()

    游标对象有以下的操作:

    1. execute()--执行sql语句   
    2. executemany--执行多条sql语句   
    3. close()--关闭游标   
    4. fetchone()--从结果中取一条记录,并将游标指向下一条记录   
    5. fetchmany()--从结果中取多条记录   
    6. fetchall()--从结果中取出所有记录   
    7. scroll()--游标滚动  

    5.建表

    >>> cu.execute('Create Table users(login varchar(8),uid integer)')
    <sqlite3.Cursor object at 0xb71db5e0>

    6.插入数据

    >>> cu.execute('Insert into users values("join",100)')
    <sqlite3.Cursor object at 0xb71db5e0>

    请注意避免以下写法:

    # Never do this -- insecure 会导致注入攻击
    
    pid=200
    c.execute("... where pid = '%s'" % pid)

    正确的做法如下,如果t只是单个数值,也要采用t=(n,)的形式,因为元组是不可变的。

    for t in[(0,10,'abc','Yu'),(1,20,'cba','Xu')]:
        cx.execute("insert into catalog values (?,?,?,?)", t)

    简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.

    >>> cx.commit()

    7.查询

    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> for eachUser in cu.fetchall():
    ...     print eachUser
    ... 
    (u'join', 100)
    (u'jane', 110)
    8.修改
    >>> cu.execute('Update Users set login="Betty" where uid = 110')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> for eachUser in cu.fetchall():
    ...     print eachUser
    ... 
    (u'join', 100)
    (u'Betty', 110)
    >>> cx.commit()

    9.删除

    >>> cu.execute('Delete from Users where uid = 110')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> for eachUser in cu.fetchall():
    ...     print eachUser
    ... 
    (u'join', 100)
    >>> cx.commit()

    10.单独取一行

    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> r = cu.fetchone()
    >>> type(r)
    <type 'tuple'>
    >>> r
    (u'join', 100)
    >>> r[0]
    u'join'
    >>> r[1]
    100

    代码汇总:

    >>> import sqlite3
    >>> cx = sqlite3.connect('./test.db')
    >>> cu = cx.cursor()
    >>> cu.execute('Create Table users(login varchar(8),uid integer)')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> cu.execute('Insert into users values("join",100)')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> cu.execute('Insert into users values("jane",110)')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> cx.commit()
    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> for eachUser in cu.fetchall():
    ...     print eachUser
    ... 
    (u'join', 100)
    (u'jane', 110)
    >>> cu.execute('Update Users set login="Betty" where uid = 110')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> for eachUser in cu.fetchall():
    ...     print eachUser
    ... 
    (u'join', 100)
    (u'Betty', 110)
    >>> cx.commit()
    >>> cu.execute('Delete from Users where uid = 110')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> for eachUser in cu.fetchall():
    ...     print eachUser
    ... 
    (u'join', 100)
    >>> cx.commit()
    >>> cu.execute('Select * From Users')
    <sqlite3.Cursor object at 0xb71db5e0>
    >>> r = cu.fetchone()
    >>> type(r)
    <type 'tuple'>
    >>> r
    (u'join', 100)
    >>> r[0]
    u'join'
    >>> r[1]
    100

    终于写完了,累趴了。

    转载请注明出处:http://www.cnblogs.com/sysu-blackbear/  谢谢!


  • 相关阅读:
    python基础
    目标文件格式
    PHP 计算每个月的最后一天
    学习应该专注于学习这件事上
    以 Composer 的方式在 PhpStorm 中添加代码审查工具 Code Sniffer
    开始在博客园写文章啦!
    Git 常用操作
    常用写作格式
    将公司的主要项目从eclipse迁移到android studio for mac环境(1)
    写随笔、博客的心情
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/3823850.html
Copyright © 2011-2022 走看看