用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 '\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方法。
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 = [('何辉宇','',''),('何辉宁','','')]
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
{'\xe7\x94\xb5\xe8\xaf\x9d': '', '\xe5\xb9\xb4\xe9\xbe\x84': '', '\xe5\xa7\x93\xe5\x90\x8d': '\xe4\xbd\x95\xe8\xbe\x89\xe5\xae\x87'} {'\xe7\x94\xb5\xe8\xaf\x9d': '', '\xe5\xb9\xb4\xe9\xbe\x84': '', '\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
终于写完了,累趴了。
转载请注明出处:http://www.cnblogs.com/sysu-blackbear/谢谢!
用python处理文本,本地文件系统以及使用数据库的知识基础的更多相关文章
- 【程序员技术练级】学习一门脚本语言 python(二)遍历本地文件系统
这篇将讲述怎么使用python来遍历本地文件系统,并把文件按文件大小从小到大排序的一个小例子 在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指 ...
- React Native之本地文件系统访问组件react-native-fs的介绍与使用
React Native之本地文件系统访问组件react-native-fs的介绍与使用 一,需求分析 1,需要将图片保存到本地相册: 2,需要创建文件,并对其进行读写 删除操作. 二,简单介绍 re ...
- OSSFS将OSS bucket 挂载到本地文件系统及注意事项
OSSFS将OSS bucket 挂载到本地文件系统及注意事项 下载ossfs安装包 wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/as ...
- 解决从linux本地文件系统上传文件到HDFS时的权限问题
当使用 hadoop fs -put localfile /user/xxx 时提示: put: Permission denied: user=root, access=WRITE, inode=& ...
- HTML5之本地文件系统API - File System API
HTML5之本地文件系统API - File System API 新的HTML5标准给我们带来了大量的新特性和惊喜,例如,画图的画布Canvas,多媒体的audio和video等等.除了上面我们提到 ...
- QTreeWidget实现动态加载本地文件系统
QT之前没有接触过,之所以做这个也是被临时拉去GoldenFarm组去做渲染的客户端:还别说,虽说是第一次,做出来的这个东西倒是挺让我满意的.先说一下具体需求,然后再上图吧: 渲染时在选择场景文件时, ...
- 基于本地文件系统的LocalDB
零.前言 之前写一些小工具的时候,需要用到数据存储方面的技术,但是用数据库又觉得太大了,本地文件存储txt文件存储又不是很规范,于是乎想到了去编写一个简单的基于本地文件系统的数据存储库,暂且叫它loc ...
- Python模糊查询本地文件夹去除文件后缀(7行代码)
Python模糊查询本地文件夹去除文件后缀 import os,re def fuzzy_search(path): word= input('请输入要查询的内容:') for filename in ...
- 阿里云oss挂载到linux本地文件系统
对象存储 OSS 阿里云对象存储服务 (OSS) 是一种高度可伸缩且安全可靠的云对象存储服务,让您可以存储.备份和归档大量数据.阿里云 OSS 是一种简单易用的服务,让您每秒能处理数百万请求,它还支持 ...
随机推荐
- Unity攻击敌人时产生泛白效果
Shader的代码如下,主要是将透明度为1的像素点输出为白色,其中_BeAttack表示角色被攻击的泛白状态 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_M ...
- Unity Dotween官方案例学习
本文只涉及一些案例,具体查看 DoTween 官方文档. 一. Basics public class Basics : MonoBehaviour { public Transform redCub ...
- PAT-1010 Radix
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 1 ...
- dp算法之平安果路径问题c++
前文:https://www.cnblogs.com/ljy1227476113/p/9563101.html 在此基础上更新了可以看到行走路径的代码. 代码: #include <iostre ...
- classpath与clsspath*
classpath是指 WEB-INF文件夹下的classes目录 classes含义: 1.存放各种资源配置文件 eg.init.properties log4j.properties struts ...
- 5月29,48h,Geekathon,创业极客的梦想起点
http://mp.weixin.qq.com/s?__biz=MjM5ODQ3MDIwMg==&mid=213768178&idx=1&sn=0a607fac483f3eab ...
- React组件继承的由来
没有显式继承的时候我们这么写: import * as React from "react"; export interface HelloProps { compiler: st ...
- Linux 基础一(系统分区、格式化与挂载)
1.Linux 基础之系统分区与格式化 讲分区之前,先说一下硬盘结构:硬盘(机械)的横截面是一个圆,并且被分成等大小的扇区,每个扇区的大小是 512Byte,其中有 446Byte 被用来存储启动信息 ...
- HDU 2015 偶数求和
http://acm.hdu.edu.cn/showproblem.php?pid=2015 Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的 ...
- Jmeter put 方法总结
1.百度到很多关于jmeter put 方法的使用 ,但觉得都完全 下面我大致总结下 : >1.放入 url 中 如:www.*****.com?a=1&b=2 ; >2.放入到p ...