python读取文件
1.读取csv文件
import csv
reader=csv.reader(open('E:\订单报表.csv','rb'))
for line in reader:
print line
2.读取txt文件
rs = []
for ln in file('a.txt','rt'):
rs.extend(ln.strip().split(' '))
3.
str_seperator = "=================================================================================="
04 timePointName = ["enter OpenNextImage at",#0
05 "enter OpenImage at",#1
06 "In OpenImage send On_ImageRefresh at",#2
07 "leave OpenImage at",#3
08 "leave OpenNextImage at",#4
09 "enter LoadImage at",#5
10 "decode began at",#6
11 "enter DrawClient at",#7
12 "leave DrawClient at",#8
13 "decode end at",#9
14 "in LoadImage send On_ImageRefresh at",#10
15 "leave loadImage at",#11
16 "second enter DrawClient at",#12
17 "second leave DrawClient at" #13
18 ]
19
20 itemNumber= 0;
21 avgTotal = 0; #13-0
22 avgFirstDraw = 0; #8-2
23 avgLoadImage = 0; #11-5
24 avgSecondDraw = 0;#13-10
25
26 fobj = open("F:\log.txt","r")
27 imageTimeSta = {}
28 dic = {}
29 path = ""
30 idx = 0
31 for line in fobj:
32 idx = idx + 1
33 if idx == 1:
34 line = line[3:]
35 else:
36 pass
37
38 line = line.strip()
39 line = line.decode("utf-8").encode("gbk")
40 if line == str_seperator:
41 if path == "":
42 pass
43 else:
44 imageTimeSta[path] = dic
45 dic = {}
46 path = ""
47 continue
48
49 tabIndex = line.find('\t')
50 if tabIndex == -1:
51 path = line
52 print path
53 continue
54
55 tabLastIndex = line.rfind('\t')
56 name = line[0:tabIndex]
57 time = int(line[tabLastIndex + 1:])
58 if name in dic:
59 dic["second " + name] = time
60 else:
61 dic[name] = time
62
63 fobj.close()
64 itemNumber = len(imageTimeSta)
65 keys = imageTimeSta.keys();
66 for (k,dic) in imageTimeSta.iteritems():
67 avgTotal += dic[timePointName[13]] - dic[timePointName[0]];
68 avgFirstDraw += dic[timePointName[8]] - dic[timePointName[2]];
69 avgLoadImage += dic[timePointName[11]] - dic[timePointName[5]];
70 avgSecondDraw += dic[timePointName[13]] - dic[timePointName[10]];
71
72 print 'avgTotal',avgTotal / float(itemNumber)
73 print 'avgFirstDraw',avgFirstDraw / float(itemNumber)
74 print 'avgLoadImage',avgLoadImage / float(itemNumber)
75 print '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:
while True:
chunk = file_object.read(100)
if not chunk:
break
do_something_with(chunk)
finally:
file_object.close( )
读每行
list_of_all_the_lines = file_object.readlines( )
如果文件是文本文件,还可以直接遍历文件对象获取每行:
for line in file_object:
process line
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)while not file.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是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加 支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ '\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
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 ... in file这样的语句时,就是调用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,读取了整个文件
>>> print fp.read()
0123456789
0123456789
0123456789
0123456789
0123456789
#如果指定size=12,则正好读取12个字节
>>> print fp.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)softspace 0表示需要在print语句里明确地加上空格;否则为1
---------
有待研究
5)newlines
6)encoding
f1 = file(r"XXXXX\date.txt")
d = [f1.tell()]
line_date = f1.readline()
while line_date:
d.append(f1.tell())
line_date = f1.readline()
d.reverse()
for i in d[1:]: <--第一个为空行.可以忽略
f1.seek(i) <---定位到某一行
reverse_data = f1.readline()
print repr(reverse_data)
f1.close()
6.字符过滤
Python天天美味(16) - 过滤字符串的技巧,map与itertools.imap
Python中的map函数非常有用,在字符转换和字符遍历两节都出现过,现在,它又出现了,会给我们带来什么样的惊喜呢?是不是要告诉我们,map是非常棒的,以后要多找它玩呢?
具体的实例
我们需要在目录中遍历,包括子目录(哈哈),找出所有后缀为:rmvb ,avi ,pmp 的文件。(天哪?!你要干什么?这可是我的隐私啊~~)
import os
def anyTrue(predicate, sequence):
return True in map(predicate, sequence)
def filterFiles(folder, exts):
for fileName in os.listdir(folder):
if os.path.isdir(folder + '/' + fileName):
filterFiles(folder + '/' + fileName, exts)
elif anyTrue(fileName.endswith, exts):
print fileName
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对象。代码如下:
import itertools
def anyTrue(predicate, sequence):
return True in itertools.imap(predicate, sequence)
def endsWith(s, *endings):
return anyTrue(s.endswith, endings)
imap 等价于:
def imap(function, *iterables):
iterables = map(iter, iterables)
while True:
args = [i.next() for i in iterables]
if function is None:
yield tuple(args)
else:
yield function(*args)
7.python读写csv文件(2011-06-20 09:13:32)转载标签: 杂谈 分类: python
test文件
"Symbol","Name","LastSale","MarketCap","IPOyear","Sector","Industry","Summary Quote",
"FAX","Aberdeen Asia-Pacific Income Fund Inc","7.2","1879027200","1986","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=FAX&selected=FAX",
"IAF","Aberdeen Australia Equity Fund Inc","12.12","232788840","1985","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=IAF&selected=IAF",
"CH","Aberdeen Chile Fund, Inc.","21","213507000","n/a","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=CH&selected=CH",
"ETF","Aberdeen Emerging Markets Telecommunications and Infrastructur","18.23","150324580","1992","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=ETF&selected=ETF",
"FCO","Aberdeen Global Income Fund, Inc.","13.19","118591290","1992","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=FCO&selected=FCO",
"IF","Aberdeen Indonesia Fund, Inc.","12.96","107179200","1990","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=IF&selected=IF",
"ISL","Aberdeen Israel Fund, Inc.","16.6892","71296262.4","1992","n/a","n/a","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=ISL&selected=ISL",
"AXK","Accelr8 Technology Corporation","4.95","53336250","n/a","Capital Goods","Biotechnology: Laboratory Analytical Instruments","http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=AXK&selected=AXK",
file = open('test')
file.readline()
读取了一行,下次再引用file的时候,将file的文件指针指向第二行开始的文件.
import csv writer = csv.writer(file('your.csv', 'wb'))writer.writerow(['Column1', 'Column2', 'Column3'])lines = [range(3) for i in range(5)]for line in lines:writer.writerow(line)
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
现在每个字符串都被引起来了:
$ python csv_writer_quoted.py testout_quoted.csv $ cat testout_quoted.csv "Title 1","Title 2","Title 3" 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,Adj Close
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.读取的代码
import csv
file = open('/home/pengtao/pythontest/AAU')
file.readline() #读掉第一行,下次再引用file的时候,将file的文件指针指向第二行开始的文件.
reader = csv.reader(file)
for c1,c2,c3,c4,c5,c6,c7 in reader:
print c7
不读掉第一行的代码
import csv
file = open('/home/pengtao/pythontest/AAU')
reader = csv.reader(file)
for c1,c2,c3,c4,c5,c6,c7 in reader:
print c7
为何是c1到c7,因为共有7个数据项.
也可以
import csv
file = open('/home/pengtao/pythontest/AAU')
reader = csv.reader(file)
for line in reader:
print line