主要是想通过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,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 = [('何辉宇','',''),('何辉宁','','')]
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 —— 标准输入输出,错误输出

标准输入和标准错误 (通常缩写为 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\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就是一个数据库连接对象,它可以有以下操作:

  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处理文本,本地文件系统以及使用数据库的知识基础的更多相关文章

  1. 【程序员技术练级】学习一门脚本语言 python(二)遍历本地文件系统

    这篇将讲述怎么使用python来遍历本地文件系统,并把文件按文件大小从小到大排序的一个小例子 在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指 ...

  2. React Native之本地文件系统访问组件react-native-fs的介绍与使用

    React Native之本地文件系统访问组件react-native-fs的介绍与使用 一,需求分析 1,需要将图片保存到本地相册: 2,需要创建文件,并对其进行读写 删除操作. 二,简单介绍 re ...

  3. OSSFS将OSS bucket 挂载到本地文件系统及注意事项

    OSSFS将OSS bucket 挂载到本地文件系统及注意事项 下载ossfs安装包 wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/as ...

  4. 解决从linux本地文件系统上传文件到HDFS时的权限问题

    当使用 hadoop fs -put localfile /user/xxx 时提示: put: Permission denied: user=root, access=WRITE, inode=& ...

  5. HTML5之本地文件系统API - File System API

    HTML5之本地文件系统API - File System API 新的HTML5标准给我们带来了大量的新特性和惊喜,例如,画图的画布Canvas,多媒体的audio和video等等.除了上面我们提到 ...

  6. QTreeWidget实现动态加载本地文件系统

    QT之前没有接触过,之所以做这个也是被临时拉去GoldenFarm组去做渲染的客户端:还别说,虽说是第一次,做出来的这个东西倒是挺让我满意的.先说一下具体需求,然后再上图吧: 渲染时在选择场景文件时, ...

  7. 基于本地文件系统的LocalDB

    零.前言 之前写一些小工具的时候,需要用到数据存储方面的技术,但是用数据库又觉得太大了,本地文件存储txt文件存储又不是很规范,于是乎想到了去编写一个简单的基于本地文件系统的数据存储库,暂且叫它loc ...

  8. Python模糊查询本地文件夹去除文件后缀(7行代码)

    Python模糊查询本地文件夹去除文件后缀 import os,re def fuzzy_search(path): word= input('请输入要查询的内容:') for filename in ...

  9. 阿里云oss挂载到linux本地文件系统

    对象存储 OSS 阿里云对象存储服务 (OSS) 是一种高度可伸缩且安全可靠的云对象存储服务,让您可以存储.备份和归档大量数据.阿里云 OSS 是一种简单易用的服务,让您每秒能处理数百万请求,它还支持 ...

随机推荐

  1. Jenkins报表 代码 指标分析

    Jenkins报表 这表现在前面的章节中,也有可用最简单的一种是适用于 JUnit 测试报告的许多报表插件. 在生成后动作进行任何工作,你可以定义要创建的报告. 该构建已经完成,测试结果选项将可进一步 ...

  2. codeforces 1141G Privatization of Roads in Treeland

    题目链接:http://codeforces.com/contest/1141/problem/G 题目大意: 给你一个无向连通图.每条边都有颜色,如果存在一个点的临边中有超过两条边颜色相同,这个点就 ...

  3. FUNMVP:5G技术对块链信任体系建设的影响

    01 区块链现阶段应用在于概念证明 12月10日,工信部向三大运营商正式发放了5G系统实验频率运用允许,这让区块链从业者开端思索5G技术与区块链分别的可能性.在互联网的基础上依据区块链的特性完成价值的 ...

  4. DRF框架QQ登录功能

    用户模块---QQ登录 流程图 QQ登录文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0 流程简述 ...

  5. PHP学习 类型 变量 常数 运算符

    PHP支持下列8种类型 标量类型 scalar type整数 integer浮点数 float double布尔 boolean字符串 string 特殊类型 special typeNULL资源 r ...

  6. 《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS

    郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统Me ...

  7. 云平台项目--学习经验--打包压缩工具requirejs

    requirejs是一个JavaScript模块加载器.适合在浏览器中国使用,也可以在其他脚本环境使用,它鼓励了代码的模块化.使用RequireJS加载模块化脚本将提高代码的加载速度和质量.如何加载R ...

  8. File类操作文件

    简单示例: public static void main(String[] args) { // 列出系统所有的根路径 File[] listRoots = File.listRoots(); fo ...

  9. java词频统计——改进后的单元测试

    测试项目 博客文章地址:[http://www.cnblogs.com/jx8zjs/p/5862269.html] 工程地址:https://coding.net/u/jx8zjs/p/wordCo ...

  10. 在配置文件里面设置bean 那么在类里面就要提供set方法用以注入

    在配置文件里面设置bean 那么在类里面就要提供set方法用以注入