标签:des style blog http color 使用
主要是想通过python之流的脚本语言来进行文件系统的遍历,处理文本以及使用简易数据库的操作。
本文基于陈皓的:《程序员技术练级攻略》
对于电子表格和数据库导出文件,比较常见的文件格式是.csv,所以python中的csv模块也是一个比较重要的模块。下面介绍csv常用的方法。
看一下示例:
#!/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,dialect,fieldnames,line_num方法。
参数表同上,注意在建立了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)
csv
模組巧妙地運用 dialect 的概念,將不同應用程式對 CSV 處理方式上的差異隱藏起來。
這裡的差異指的是欄位分隔字元(delimiter)跟識別資料內容的引號(quoting character)等。目前 csv
模組內建兩種 dialect - excel
(.csv
) 及 excel-tab
(.tsv
),可以用來讀取 Excel 寫出、或是寫出 Excel 可以讀取的檔案格式,而不用去管 Excel 慣用的格式為何。
跟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‘}
与之类似。
file_object = open(file_name,access_mode = ‘r‘,buffering = -1)
文件对象的访问模式:
open()和file()函数具有相同的功能,可以任意替换。您所看到任何使用open()的地方,都可以使用file()替换它。
read(size),readline(),readlines(),write()
for eachLine in f:
pass
sys模块中的函数非常多,挑几个有用的来讲讲。
>>> 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"
执行至主程序的末尾时,解释器会自动退出. 但是如果需要中途退出程序, 你可以调用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?
>>> 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”).
使用方法:
>>> sys.modules
常用方法:
for names in sys.modules.keys(): if names != ’sys’: pass
标准输入和标准错误 (通常缩写为 stdout 和 stderr) 是内建在每一个 UNIX 系统中的管道。
当你 print 某些东西时,结果前往 stdout 管道;
当你的程序崩溃并打印出调试信息 (例如 Python 中的 traceback (错误跟踪)) 的时候,信息前往 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语句。
os 模块的文件/目录访问函数
文件处理
目录/文件夹
访问/权限
文件描述符操作
os.path 模块的文件/目录访问函数
分隔
信息
查询
Sqllite是一个小巧的内嵌型数据库,也就是说没有独立的维护进程。
1.导入模块
>>> import sqlite3
2. 创建/打开数据库
可以打开数据库:
cx = sqlite3.connect(‘./test.db‘)
也可以存在内存当中:
con = sqlite3.connect(":memory:")
3.数据库连接对象
打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:
关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。
4.使用游标查询数据库cu = cx.cursor()
游标对象有以下的操作:
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处理文本,本地文件系统以及使用数据库的知识基础,布布扣,bubuko.com
用python处理文本,本地文件系统以及使用数据库的知识基础
标签:des style blog http color 使用
原文地址:http://www.cnblogs.com/sysu-blackbear/p/3823850.html