python读取文件
1.读取csv文件
importcsv
reader=csv.reader(open('E:\订单报表.csv','rb'))
forlineinreader:
printline
2.读取txt文件
rs=[]
forlninfile('a.txt','rt'):
rs.extend(ln.strip().split(''))
3.
str_seperator="=================================================================================="
04timePointName=["enterOpenNextImageat",#0
05"enterOpenImageat",#1
06"InOpenImagesendOn_ImageRefreshat",#2
07"leaveOpenImageat",#3
08"leaveOpenNextImageat",#4
09"enterLoadImageat",#5
10"decodebeganat",#6
11"enterDrawClientat",#7
12"leaveDrawClientat",#8
13"decodeendat",#9
14"inLoadImagesendOn_ImageRefreshat",#10
15"leaveloadImageat",#11
16"secondenterDrawClientat",#12
17"secondleaveDrawClientat"#13
18]
19
20itemNumber=0;
21avgTotal=0;#13-0
22avgFirstDraw=0;#8-2
23avgLoadImage=0;#11-5
24avgSecondDraw=0;#13-10
25
26fobj=open("F:\log.txt","r")
27imageTimeSta={}
28dic={}
29path=""
30idx=0
31forlineinfobj:
32idx=idx+1
33ifidx==1:
34line=line[3:]
35else:
36pass
37
38line=line.strip()
39line=line.decode("utf-8").encode("gbk")
40ifline==str_seperator:
41ifpath=="":
42pass
43else:
44imageTimeSta[path]=dic
45dic={}
46path=""
47continue
48
49tabIndex=line.find('\t')
50iftabIndex==-1:
51path=line
52printpath
53continue
54
55tabLastIndex=line.rfind('\t')
56name=line[0:tabIndex]
57time=int(line[tabLastIndex+1:])
58ifnameindic:
59dic["second"+name]=time
60else:
61dic[name]=time
62
63fobj.close()
64itemNumber=len(imageTimeSta)
65keys=imageTimeSta.keys();
66for(k,dic)inimageTimeSta.iteritems():
67avgTotal+=dic[timePointName[13]]-dic[timePointName[0]];
68avgFirstDraw+=dic[timePointName[8]]-dic[timePointName[2]];
69avgLoadImage+=dic[timePointName[11]]-dic[timePointName[5]];
70avgSecondDraw+=dic[timePointName[13]]-dic[timePointName[10]];
71
72print'avgTotal',avgTotal/float(itemNumber)
73print'avgFirstDraw',avgFirstDraw/float(itemNumber)
74print'avgLoadImage',avgLoadImage/float(itemNumber)
75print'avgSecondDraw',avgSecondDraw/float(itemNumber)
1.open
使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
file_object=open('thefile.txt')
try:
all_the_text=file_object.read()
finally:
file_object.close()
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
2.读文件
读文本文件
input=open('data','r')
#第二个参数默认为r
input=open('data')
读二进制文件
input=open('data','rb')
读取所有内容
file_object=open('thefile.txt')
try:
all_the_text=file_object.read()
finally:
file_object.close()
读固定字节
file_object=open('abinfile','rb')
try:
whileTrue:
chunk=file_object.read(100)
ifnotchunk:
break
do_something_with(chunk)
finally:
file_object.close()
读每行
list_of_all_the_lines=file_object.readlines()
如果文件是文本文件,还可以直接遍历文件对象获取每行:
forlineinfile_object:
processline
3.写文件
写文本文件
output=open('data','w')
写二进制文件
output=open('data','wb')
追加写文件
output=open('data','w+')
写数据
file_object=open('thefile.txt','w')
file_object.write(all_the_text)
file_object.close()
写入多行
file_object.writelines(list_of_text_strings)
注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为2GB的机器上处理一个2GB的日志文件,我们可能希望每次只处理其中200MB的内容。
在Python中,内置的File对象直接提供了一个readlines(sizehint)函数来完成这样的事情。以下面的代码为例:
file=open('test.log','r')sizehint=209715200#200Mposition=0lines=file.readlines(sizehint)whilenotfile.tell()-position<0:position=file.tell()lines=file.readlines(sizehint)
每次调用readlines(sizehint)函数,会返回大约200MB的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比sizehint指定的值大一点(除最后一次调用readlines(sizehint)函数的时候)。通常情况下,Python会自动将用户指定的sizehint的值调整成内部缓存大小的整数倍。
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:
file(name[,mode[,buffering]])
file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
mode是打开的模式,可选的值为rwaU,分别代表读(默认)写添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’'\n''\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+bt这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
file对象有自己的属性和方法。先来看看file的属性。
closed#标记文件是否已经关闭,由close()改写
encoding#文件编码
mode#打开模式
name#文件名
newlines#文件中用到的换行模式,是一个tuple
softspace#boolean型,一般为0,据说用于print
file的读写方法:
F.read([size])#size为读取的长度,以byte为单位
F.readline([size])
#读一行,如果定义了size,有可能返回的只是一行的一部分
F.readlines([size])
#把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
F.write(str)
#把str写到文件中,write()并不会在str后加上一个换行符
F.writelines(seq)
#把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
file的其他方法:
F.close()
#关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
F.flush()
#把缓冲区的内容写入硬盘
F.fileno()
#返回一个长整型的”文件标签“
F.isatty()
#文件是否是一个终端设备文件(unix系统中的)
F.tell()
#返回文件操作标记的当前位置,以文件的开头为原点
F.next()
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for...infile这样的语句时,就是调用next()函数来实现遍历的。
F.seek(offset[,whence])
#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
F.truncate([size])
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
5.
1、内建函数open
fileobj=open(filename,mode='r',buffering=-1)
mode的取值:
a输入到文件尾部,如果文件不存在,则创建一个
r只读方式打开文件,如果文件不存在则引发IOError
r+打开文件进行读取和写入,如果文件不存在则引发IOError
w打开文件进行写入,如果文件存在,则清除其中所有内容;如果文件不存在则创建一个
w+打开文件进行读取和写入,如果文件存在,则清除其中所有内容;如果文件不存在则创建一个
ab,rb,wb,r+b,w+b打开文件以便进行二进制输入或输出(只有windows和mac平台才支持此模式)
buffering指明访问文件时使用的数据缓冲方式:0-不缓冲;1-表示缓冲一行数据;任何大于1的数字表示对I/O进行缓冲,缓冲区长度就是给出的数字;缺省-1,对tty串行设备使用行缓冲,对其余设备使用正常缓冲。
如果成功打开文件,就会返回一个文件对象。
2、文件对象的方法
1)close()关闭文件对象
2)fileno()返回一个整数的文件描述符
aaa.txt文件内容:
0123456789
0123456789
0123456789
0123456789
0123456789
>>>fname='c:\\aaa.txt'
>>>fp=open(fname,'a')
>>>fp.fileno()
3
3)flush()刷新文件的内部缓冲区
4)isatty()如果文件是一个串行类设备就返回True;否则返回False
>>>fp.isatty()
False
5)read([size])把整个文件或size个字节长的文件数据读入一个字符串,返回值就是这个字符串
read是从当前文件位置开始读的,所有只有文件指针为0时(文件起始位置),才能读取整个文件。
#没有指定size,读取了整个文件
>>>printfp.read()
0123456789
0123456789
0123456789
0123456789
0123456789
#如果指定size=12,则正好读取12个字节
>>>printfp.read(12)
0123456789
06)readline([size])
读取一行包括'\n',当读到文件尾的时候会返回一个空行("")。如果没有指定size读到行尾,指定size则只读取size个字节
#没有指定size,默认读取以一行直到行尾,包括\n
>>>fp.readline()
'0123456789\n'
#指定了size,读取size个字节
>>>fp.readline(8)
'01234567'
#虽然没有指定size,但是从当前文件指针开始读取到了行尾
>>>fp.readline()
'89\n'
#指定了size,超过了一行的字节数,也就只读取一行
>>>fp.readline(13)
'0123456789\n'
7)readlines([size])
读取多行并以字符串列表返回。没有指定size则读到文件尾部,指定size则读取size个字节。
>>>fp.readlines()
['0123456789\n','0123456789\n','0123456789\n','0123456789\n','0123456789']
#指定size参数的没有试出来
>>>fp.readlines(1)
['0123456789\n','0123456789\n','0123456789\n','0123456789\n','0123456789']
>>>
8)tell()返回文件指针当前位置
9)seek(offset,[location])
在文件中移动offset个字节,默认从文件起始处开始移动,如果指定location则从指定位置开始移动。
location(0=文件头SEEK_SET;1=当前位置SEEK_CUR;2=文件尾SEEK_END)
>>>fp.tell()
58L
>>>fp.seek(0)#移动到文件起始位置
>>>fp.tell()
0L
10)truncate([size])
把文件截短为size个字节,size默认是当前文件指针位置,也就是tell()返回的位置
>>>fp.truncate(4)
>>>fp.read()
'0123'
11)write(str)把str写到文件中
(如果write后不进行flush,close或者seek,直接read,那么写的文件就会出现大量的无用数据,怀疑是把缓冲区里的内容写到文件中去了,这个不会是bug吧)
12)writelines(strlist)把字符串列表写到文件中去
13)xreadlines()不知道怎么用
14)next()试着用了下,好像也是读一行,不知道和readline的区别是什么
3.文件属性
1)closed文件被关闭为true,否则false
2)mode文件的打开方式
3)name文件名
4)softspace0表示需要在print语句里明确地加上空格;否则为1
---------
有待研究
5)newlines
6)encoding
f1=file(r"XXXXX\date.txt")
d=[f1.tell()]
line_date=f1.readline()
whileline_date:
d.append(f1.tell())
line_date=f1.readline()
d.reverse()
foriind[1:]:<--第一个为空行.可以忽略
f1.seek(i)<---定位到某一行
reverse_data=f1.readline()
printrepr(reverse_data)
f1.close()
6.字符过滤
Python天天美味(16)-过滤字符串的技巧,map与itertools.imap
Python中的map函数非常有用,在字符转换和字符遍历两节都出现过,现在,它又出现了,会给我们带来什么样的惊喜呢?是不是要告诉我们,map是非常棒的,以后要多找它玩呢?
具体的实例
我们需要在目录中遍历,包括子目录(哈哈),找出所有后缀为:rmvb,avi,pmp的文件。(天哪?!你要干什么?这可是我的隐私啊~~)
importos
defanyTrue(predicate,sequence):
returnTrueinmap(predicate,sequence)
deffilterFiles(folder,exts):
forfileNameinos.listdir(folder):
ifos.path.isdir(folder+'/'+fileName):
filterFiles(folder+'/'+fileName,exts)
elifanyTrue(fileName.endswith,exts):
printfileName
exts=['.rmvb','.avi','.pmp']
filterFiles('/media/Personal/Movie',exts)
输出结果
来看看有什么好东东:
[66影视www.66ys.cn]迷失第四季04.rmvb
[迷失.第4季].Lost.S04E00.rmvb
[迷失Lost第四季][第02集][中文字幕].rmvb
《迷失Lost第四季》第05集[中文字幕].rmvb
《迷失Lost第四季》第06集[中文字幕].rmvb
《迷失Lost第四季》第07集[中文字幕].rmvb
天赐第2季01.rmvb
天赐第2季02.rmvb
天赐第2季03.rmvb
天赐第2季04.rmvb
天赐第2季05.rmvb
影视帝国(bbs.cnxp.com).美丽心灵.A.Beautiful.Mind.2001.CD1.rmvb
(...太多了,不要全输出来吧~~)
扩展
CookBook一书中,提供的是itertools.imap来实现对字符串的过滤。imap和map不同的是,imap返回的是一个iteration对象,而map返回的是一个list对象。代码如下:
importitertools
defanyTrue(predicate,sequence):
returnTrueinitertools.imap(predicate,sequence)
defendsWith(s,*endings):
returnanyTrue(s.endswith,endings)
imap等价于:
defimap(function,*iterables):
iterables=map(iter,iterables)
whileTrue:
args=[i.next()foriiniterables]
iffunctionisNone:
yieldtuple(args)
else:
yieldfunction(*args)
7.python读写csv文件(2011-06-2009:13:32)转载标签:杂谈分类:python
test文件
"Symbol","Name","LastSale","MarketCap","IPOyear","Sector","Industry","SummaryQuote",
"FAX","AberdeenAsia-PacificIncomeFundInc","7.2","1879027200","1986","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=FAX&selected=FAX",
"IAF","AberdeenAustraliaEquityFundInc","12.12","232788840","1985","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=IAF&selected=IAF",
"CH","AberdeenChileFund,Inc.","21","213507000","n/a","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=CH&selected=CH",
"ETF","AberdeenEmergingMarketsTelecommunicationsandInfrastructur","18.23","150324580","1992","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=ETF&selected=ETF",
"FCO","AberdeenGlobalIncomeFund,Inc.","13.19","118591290","1992","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=FCO&selected=FCO",
"IF","AberdeenIndonesiaFund,Inc.","12.96","107179200","1990","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=IF&selected=IF",
"ISL","AberdeenIsraelFund,Inc.","16.6892","71296262.4","1992","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=ISL&selected=ISL",
"AXK","Accelr8TechnologyCorporation","4.95","53336250","n/a","CapitalGoods","Biotechnology:LaboratoryAnalyticalInstruments","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=AXK&selected=AXK",
file=open('test')
file.readline()
读取了一行,下次再引用file的时候,将file的文件指针指向第二行开始的文件.
importcsvwriter=csv.writer(file('your.csv','wb'))writer.writerow(['Column1','Column2','Column3'])lines=[range(3)foriinrange(5)]forlineinlines:writer.writerow(line)
writer=csv.writer(f,quoting=csv.QUOTE_NONNUMERIC)
现在每个字符串都被引起来了:
$pythoncsv_writer_quoted.pytestout_quoted.csv$cattestout_quoted.csv"Title1","Title2","Title3"1,"a","08/01/07"2,"b","08/02/07"3,"c","08/03/07"4,"d","08/04/07"5,"e","08/05/07"6,"f","08/06/07"7,"g","08/07/07"8,"h","08/08/07"9,"i","08/09/07"10,"j","08/10/07"
引用
还有4种不同的引用选项,它们作为常量定义在csv模块中.
QUOTE_ALL
不管是什么类型,任何内容都加上引号
QUOTE_MINIMAL
这是默认的,使用指定的字符引用各个域(如果解析器被配置为相同的dialect和选项时,可能会让解析器在解析时产生混淆)
QUOTE_NONNUMERIC
引用那些不是整数或浮点数的域.当使用读取对象时,如果输入的域是没有引号,那么它们会被转换成浮点数.
QUOTE_NONE
对所有的输出内容都不加引用,当使用读取对象时,引用字符看作是包含在每个域的值里(但在正常情况下,他们被当成定界符而被去掉)
一.文件的读取
文件格式
Date,Open,High,Low,Close,Volume,AdjClose
2011-06-20,3.00,3.09,2.94,3.06,260300,3.06
2011-06-17,2.96,3.07,2.96,3.00,219200,3.00
2011-06-16,3.05,3.11,2.93,2.95,360700,2.95
2011-06-15,3.10,3.15,2.98,3.08,264300,3.08
2011-06-14,3.08,3.25,3.05,3.14,425600,3.14
2011-06-13,3.12,3.18,2.90,2.99,530900,2.99
2011-06-10,3.27,3.33,3.12,3.16,268400,3.16
2011-06-09,3.17,3.38,3.11,3.29,332300,3.29
2011-06-08,3.23,3.27,3.07,3.13,383400,3.13
2011-06-07,3.23,3.35,3.17,3.27,302700,3.27
2011-06-06,3.40,3.41,3.20,3.27,610200,3.27
2011-06-03,3.44,3.54,3.34,3.41,315900,3.41
2011-06-02,3.63,3.66,3.46,3.49,252200,3.49
2011-06-01,3.67,3.80,3.56,3.64,361100,3.64
2011-05-31,3.88,3.88,3.67,3.69,277900,3.69
2011-05-27,3.78,3.89,3.67,3.78,413300,3.78
2011-05-26,3.84,3.92,3.64,3.78,251900,3.78
2011-05-25,3.80,3.92,3.77,3.84,207600,3.84
2011-05-24,3.75,3.90,3.70,3.83,312700,3.83
2011-05-23,3.65,3.88,3.57,3.68,216800,3.68
2011-05-20,3.63,3.80,3.41,3.75,366500,3.75
2011-05-19,3.67,3.73,3.55,3.63,317500,3.63
1.读取的代码
importcsv
file=open('/home/pengtao/pythontest/AAU')
file.readline()#读掉第一行,下次再引用file的时候,将file的文件指针指向第二行开始的文件.
reader=csv.reader(file)
forc1,c2,c3,c4,c5,c6,c7inreader:
printc7
不读掉第一行的代码
importcsv
file=open('/home/pengtao/pythontest/AAU')
reader=csv.reader(file)
forc1,c2,c3,c4,c5,c6,c7inreader:
printc7
为何是c1到c7,因为共有7个数据项.
也可以
importcsv
file=open('/home/pengtao/pythontest/AAU')
reader=csv.reader(file)
forlineinreader:
printline