搜索 | 会员  
用python处理文本,本地文件系统以及使用数据库的知识基础
来源: 博客园   作者:网友  日期:2018/3/23  类别:编程语言  主题:PYTHON  编辑:美国甜心
主要是想通过python之流的脚本语言来进行文件系统的遍历,处理文本以及使用简易数据库的操作。

一.Python csv

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

1.csv.reader(csvfiledialect='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 '\n'+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(csvfiledialect='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(csvfilefieldnames=Nonerestkey=None,restval=Nonedialect='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

{'\xe7\x94\xb5\xe8\xaf\x9d': '1234', '\xe5\xb9\xb4\xe9\xbe\x84': '21', '\xe5\xa7\x93\xe5\x90\x8d': '\xe4\xbd\x95\xe8\xbe\x89\xe5\xae\x87'} {'\xe7\x94\xb5\xe8\xaf\x9d': '5678', '\xe5\xb9\xb4\xe9\xbe\x84': '21', '\xe5\xa7\x93\xe5\x90\x8d': '\xe4\xbd\x95\xe8\xbe\x89\xe5\xae\x81'}

 


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 —— 标准输入输出,错误输出

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


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


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


stdout 是一个类文件对象;调用它的 write 函数可以打印出你给定的任何字符串。

实际上,这就是 print 函数真正做的事情;它在你打印的字符串后面加上一个硬回车,然后调用 sys.stdout.write 函数。在最简单的例子中,stdout 和 stderr 把它们的输出发送到相同的地方。

和 stdout 一样,stderr 并不为你添加硬回车;如果需要,要自己加上。

stdout 和 stderr 都是类文件对象,但是它们都是只写的。它们都没有 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\n'

重定向错误信息


复制代码

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就是一个数据库连接对象,它可以有以下操作:


commit()--事务提交   

rollback()--事务回滚   

close()--关闭一个数据库连接   

cursor()--创建一个游标

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


4.使用游标查询数据库

定义游标:

cu = cx.cursor()

游标对象有以下的操作:


execute()--执行sql语句   

executemany--执行多条sql语句   

close()--关闭游标   

fetchone()--从结果中取一条记录,并将游标指向下一条记录   

fetchmany()--从结果中取多条记录   

fetchall()--从结果中取出所有记录   

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

复制代码


德仔网尊重行业规范,每篇文章都注明有明确的作者和来源;德仔网的原创文章,请转载时务必注明文章作者和来源:德仔网;
头条那些事
大家在关注
广告那些事
我们的推荐
也许感兴趣的
干货