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

0

6)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