需要用到的一些知识:
1.open() 文件操作
open(路径+文件名,读写模式)
f=open(‘/tmp/hello’,’w’)
读写模式:r只读, r+读写, w新建(会覆盖原有文件) ,a追加, b二进制文件. 常用模式
如:’rb’,’wb’,’r+b’等等
读写模式的类型有:
rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
w 以写方式打开,
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
注意:
1、使用’W’,文件若存在,首先要清空,然后(重新)创建,
2、使用’a’模式 ,把所有要写入文件的数据都追加到文件的末尾,即使你使用了seek()指向文件的其他地方,如果文件不存在,将自动被创建。
f.read([size]) size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回”“(空字串)
file.readline() 返回一行
file.readline([size]) 返回包含size行的列表,size 未指定则返回全部行
for line in f: print line #通过迭代器访问
f.write(“hello\n”) #如果要写入字符串以外的数据,先将他转换为字符串.
f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
f.seek(偏移量,[起始位置]) 用来移动文件指针
偏移量:单位:比特,可正可负
起始位置:0-文件头,默认值;1-当前位置;2-文件尾
f.close() 关闭文件
2.python strip()函数
声明:s为字符串,rm为要删除的字符序列
s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符
s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符
注意:
- 当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ’ ‘)
- 这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
3.python读取文件时提示:
“UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 205: illegal multibyte sequence”
解决办法1.
FILE_OBJECT= open(‘order.log’,’r’, encoding=’UTF-8’)
解决办法2.
FILE_OBJECT= open(‘order.log’,’rb’)
代码示例:
# 并行处理某个目录下文件中的字符个数和行数,存入res.txt文件中,
# 每个文件一行,格式为:filename:lineNumber,charNumber
import os
import time
from multiprocessing import Pool
def getFile(path) :
#获取目录下的文件list
fileList = []
for root, dirs, files in list(os.walk(path)) : # 遍历path下的所有文件
for i in files:
if i.endswith('.py'):
fileList.append(root + "\\" + i) # 得到了完整的路径
# print(fileList) # 打印符合条件的文件
return (fileList) # 打印符合条件的文件
def operFile(filePath) :
#统计每个文件中行数和字符数,并返回
with open(filePath,'r',encoding='utf-8') as f: # 以utf-8统一的编码格式
content=f.readlines()
lines = len(content)
alphaNum = 0
for i in content :
alphaNum += len(i.strip('\n'))
return filePath,lines,alphaNum
def out(list1, writeFilePath) :
#将统计结果写入结果文件中
fileLines = 0
charNum = 0
with open(writeFilePath,'a') as fp: # 以追加的模式
for i in list1 :
# 写入的第一个参数是path,第二个是行数,第三个是字符数
# 使用'w',文件若存在,首先要清空,然后(重新)创建
fp.write(i[0] + " 行数:"+ str(i[1]) + " 字符数:"+str(i[2]) + "\n")
fileLines += i[1]
charNum += i[2]
print ('总的行数:',fileLines)
print ('总的字符数:',charNum)
if __name__ == "__main__":
#创建多个进程去统计目录中所有文件的行数和字符数
startTime = time.time()
filePath = 'C:\\Users\\LiLong\\Desktop\\python日常'
fileList = getFile(filePath)
pool = Pool(5) # 创造一个进程池,并且最多能容纳5个进程
resultList =pool.map(operFile, fileList)
pool.close()
pool.join()
# 写入文件的路径
writeFilePath = "C:\\Users\\LiLong\\Desktop\\process\\rex.txt"
print(resultList)
out(resultList, writeFilePath)
endTime = time.time()
print("used time is ", endTime - startTime)
运行结果:
参考:
http://www.cnblogs.com/dkblog/archive/2011/02/24/1980651.html
http://blog.csdn.net/seetheworld518/article/details/49639651