scripy1.py文件
import sys
print(sys.path)
x=2
print(2*33)
文件迭代器读入
f=open('script1.py')
for line in open('script1.py'):
print(line.upper(),end='')
文件上使用列表解析
文件对象中的readlines方法,一次性把文件载入到行字符串的一个列表中
lines=f.readlines()
print(lines)
结果列表中的行在末尾都包含了一个换行符号。一次性去除换行符号,可以使用列表解析
lines=f.readlines()
print(lines)
lines=[line.rstrip() for line in lines]
print(lines)
由于列表解析像for循环语句一样是一个迭代环境,可以不用提前打开文件,可以在表达式中打开它,
lines =[line.rstrip() for line in open('script1.py')]
print(lines)
lines =[line.rstrip() for line in open('script1.py')]
print(lines)
lines=[line.upper() for line in open('script1.py')]
print(lines)
lines=[line.rstrip().upper() for line in open('script1.py')]
print(lines)
lines=[line.split() for line in open('script1.py')]
print(lines)
lines=[line.replace('','!') for line in open('script1.py')]
print(lines)
lines=[('sys' in line,line[0]) for line in open('script1.py')]
print(lines
扩展的列表解析语法
for循环可以有一个if子句,来过滤那些测试不为真的结果项
例如:我们需要扫描文件,只收集以字母p开头的那些行(可能每一行的第一个字母是某种类型的动作代码)。向表达式中添加一条if过滤子句来实现:
lines=[line.rstrip() for line in open('script1.py') if line[0]=='p']
print(lines)
python还包含了各种处理迭代的其他内置函数:sorted排序可迭代对象中的各项,zip组合可迭代对象中的各项,enumerate根据对应位置来配对可迭代对象中的项,filter选择一个函数为真的向,reduce针对可迭代对象中的成对的项运行一个函数。所有的这些都接受一个可迭代的对象,并且python3.0中,zip,enumerate和filter也想map一项返回一个可迭代对象。他们实际运行文件的迭代器会自动的按行扫描。如下所示:
ret = map(str.upper, open('script1.py'))
ret = list(ret)
print(ret)
print(sorted(open('script1.py')))
print(list(zip(open('script1.py'),open('script1.py'))))
print(list(enumerate(open('script1.py'))))
print(list(filter(bool,open('script1.py'))))
import functools,operator
print(functools.reduce(operator.add,open('script1.py')))
print(list(open('script1.py')))
print(tuple(open('script1.py')))
print('$$'.join(open('script1.py')))
a,b,c,d=open('script1.py')
print(a,b,c,d)
a,*b=open('script1.py')
print(a,b)
集合解析和字典解析都支持我们在本章前面介绍的列表解析的扩展语法,包括if测试:
print({line for line in open('script1.py') if line[0]=='p'})
print({ix:line for(ix,line) in enumerate(open('script1.py')) if line[0]=='p'})
函数调用中用到的特殊的*args形式,它会吧一个集合的值解包为单个参数,包括文件
def f(a,b,c,d):
print(a,b,c,d,sep='&')
f(1,2,3,4)
f(*[1,2,3,4])
f(*open('script1.py'))
python中的四种迭代环境
for循环、列表解析、map内置函数、in成员关系测试表达式以及内置函数 sorted、sum、any和all。这个分类也包括了内置函数list和tuple、字符串join方法以及序列赋值运算。所有这些都使用了迭代协议(next方法)来一次一个元素逐个遍历可迭代对象
从一个文本文件逐行读取行的最好方法是什么
在迭代环境中打开文件,诸如for循环或列表解析中,然后,让迭代工具在每次迭代中执行该文件的next方法,自动一次扫描一行。从代码编写的简易性、执行速度以及内存空间需求方面来看,这种方法是最佳方式。
用pickle存储python的原生对象
pickle模块能够让我们直接在文件中存储几乎任何Python对象的高级工具,也并不要求我们把字符串转换来转换去。例如:想要在文件中存储字典,直接用pickle来存储
从文件读取的数据回到脚本时是一个字符串,所以,如果字符串不是你所需要的,就得将其转换成其他类型的python对象,同样,与print语句不通,当你把数据写入文件时,python不会自动把对象转换为字符串-你必须传递一个已经格式化的字符串,因此,我们之前见过的处理文件时可以来回转换字符串和数字的工具会有用途。
D={'a':1,'b':2}
F=open('datafile.txt','wb')
import pickle
pickle.dump(D,F)
F.close()
F=open('datafile.txt','rb')
RET=pickle.load(F)
print(RET)