本节所讲内容:
1)文件的基本操作
2)列表的基本操作
3)元组的介绍
4)实战:创建一个购物程序
文件的基本操作
3.1 打开文件
python中使用open函数来打开文件(默认函数方式,可以省略)
语法格式:
open(文件名,文件模式,缓冲)
其中,文件模式和缓冲都是可选项
>>> f =open('name_list')
如果打开的文件不存在,会出现以下报错
>>> f = open('name')
Traceback (most recent calllast):
File"<stdin>", line 1, in <module>
IOError: [Errno 2] No suchfile or directory: 'name'
3.1.1 文件模式
open函数中模式参数的常用值
值 | 描述 |
r | 读模式 |
w | 写模式 |
a | 追加模式 |
b | 二进制模式(可添加到其他模式中使用) |
+ | 读/写模式(可添加到其他模式中使用) |
b’模式改变处理文件的方法。一般来说,Python假定处理的是文本文件(包含字符)。通常这样做不会有任何问题。但如果处理的是一些其他类型的文件(二进制文件),比如声音剪辑或者图像,那么应该在模式参数中增加‘b’。参数 ‘b’可以用来读取一个二进制文件。
3.1.2 缓冲
open函数的第3个参数(可选)控制着文件的缓冲。如果参数是0(或者False),I/O(输入/输出)就是无缓冲的(所有的读写操作都直接针对硬盘);如果是1(或者是True),I/O就是有缓冲的(意为着Python使用内存来代替硬盘,让程序更快,只有使用flush或者close是才会更新硬盘上的数据)。大于1的数字代表缓冲区的大小(单位是字节),-1(或者是任何负数)代表使用默认的缓冲区大小。
3.2 基本的文件方法
3.2.1 写文件
>>> newfile =file('a.txt','w') #创建一个新的文件a.txt
>>>newfile.write('Hello,World!!!') #在文件中写入“Hello,World!!!”
>>> newfile.flush() #刷新文件内容
>>> newfile.close() #关闭文件
在另外一个终端查看发现已经生成了a.txt文件,查看文件内容已经生成
注:在Python中对文件进行写入操作时,默认保存在内存中1024字节的内容,在没有对文件执行close关闭时,不写入磁盘,这样有利于提高运行效率,如果写入的内容操作1024字节,将会自动写入磁盘
补充一下:
python中中文的输入方式
Python默认的字符编码ASCII,如果要想让输出内容显示中文在脚本中转换一下字符编码
#coding=utf-8
[root@xuegod163 test]# ls
a.txt
[root@xuegod163 test]# cata.txt
Hello,World!!![root@xuegod163test]#
注:
1)如果这里要换行显示,可以在写入的内容之后加上换行符“\n”
>>>newfile.write('Hello,World!!!\n')
2)如果原本已经存在a.txt文件,再次进行写操作的话,将会重新创建文件
>>> newfile =file('a.txt','w')
>>> newfile =file('a.txt','w')
执行完此操作后再次查看a.txt,发现内容为空
3)在Python中要慎用‘w’
3.2.2 读文件
>>> f =file('a.txt','r') #指定文件模式为读模式
>>> f.read() #读取文件全部内容
'Hello,Girl!!!Hello,Boy!!!Hello,Boy!!!\nHello,Boy!!!\n'
>>> f =file('a.txt','r')
>>> f.read(5) #指定读文件的字节数
'Hello'
>>> f.read() #再次执行,读取文件剩下的全部内容
'!!!Hello,Boy!!!Hello,Boy!!!\nHello,Boy!!!\n'
>>> f =file('name_list','r') #文件模式“r”可以省略
>>> f.readline() #逐行读取文件内容
'01\tZhaoXiangJie\tIT\t99\t99\t99\t99\r\n' #文件第一行
>>> f.readline()
'02\tLiuBei\t\tSHU\t98\t78\t83\t80\r\n' #文件第二行
…………
3.2.3 追加文件
>>> f =file('a.txt','a')
>>>f.write('Hello,Boy!!!\n')
>>> f.flush()
>>> f.close()
[root@xuegod163 test]# cata.txt
Hello,Girl!!!Hello,Boy!!!
3.2.4 管式输出
cat 文件 | python 脚本
cat读取到的文件的内容通过管道作为脚本执行的标准输入(stdin),脚本中通过插入sys模块,引用文件的内容
例:
[root@localhost ~]# vimpipe.py
#!/usr/bin/env python
import sys
text = sys.stdin.read()
words = text.split()
wordcount = len(words)
print "Wordcount:%s" % wordcount
[root@localhost ~]# catexample.txt
Nice to meet you
Today is a sunny.
执行结果
[root@localhost ~]# catexample.txt | python pipe.py
Wordcount: 8
注:split是字符串处理的一种方法,把字符串转换成列表的格式
>>> a = 'nice tomeet you'
>>> a.split()
split默认的分隔符是空格, 可以进行自定义
>>> b.split('/')
['', 'usr', 'bin','python']
3.2.5 在文件的指定位置进行写操作
python中通过seek方法可以定位到写的位置
>>> f =file('a.txt','w')
>>>f.write('0123456789')
>>> f.seek(5) #定位到第五个字节位
>>>f.write('Hello,World!')
>>> f.flush()
>>> f.close()
>>> f =file('a.txt','r')
>>> f.read()
'01234Hello,World!'
tell方法返回当前文件的位置
>>> f =file('a.txt','r')
>>> f.read(3)
'012'
>>> f.read(2)
'34'
>>> f.tell()
5
注:Python中函数有很多,不会使用时要学会使用help进行查询
>>> help(file.tell)
Help on method_descriptor:
tell(...)
tell() -> current file position, an integer (may be along integer).
3.2.6 文件内容替换
语法格式
for line in fileinput.input(“filepath”,inplace=1)
line = line.replace(“oldtext”,”newtext”)
print line
例:
[root@localhost ~]# viminput.py
#!/usr/bin/env python
import fileinput
for line infileinput.input('a.txt',backup='bak',inplace=1):
line = line.replace('world','Python')
print line
fileinput.close()
执行脚本之后查看a.txt
[root@localhost ~]# cata.txt
Hello,Python!
而且在当前目录下生成bak结尾的文件
inplace=1:标准输出会被重定向到打开文件;backup='bak',:替换文件内容之前备份后缀以bak结尾
3.2.7 修改文件内容
[root@localhost ~]# vimwith.py
#!/usr/bin/env python
with open('a.txt','r+') as f:
old = f.read()
f.seek(13)
f.write('new line\n' + old)
查看文件内容
[root@localhost ~]# cata.txt
Hello,Python!new line
Hello,Python!
3.3 列表的基本使用
列表是Python的6种内建序列(还有元组,字符串,Unicode字符串,buffer对象,xrange对象)之一,列表内的值可以进行更改,操作灵活,在Python脚本中应用非常广泛
列表的语法格式
[ ‘元素1’,‘元素2’,‘元素3’,……,‘元素n’]
在需要操作一组数值的时候,序列很好用。可以通过序列表示数据库中一个人的信息——第一个元素是姓名,第二个元素是年龄。根据上述内容编写一个列表
>>> zhangsan =['zhangsan',18]
>>> lisi =['lisi',19]
>>>database=[zhangsan,lisi]
>>> database
[['zhangsan', 18],['lisi', 19]]
3.3.1 索引
序列中的所有元素都是有编号的,从0开始递增。这些元素可以通过编号分别访问
>>> company ='xuegod'
>>> company[0]
'x'
所有序列都可以通过这种方式进行索引,使用负数索引时,Python会从右边,也就是从最后一个元素开始计数。最后一个元素的位置编号是-1(不是-0,避免和第一个元素重合)
>>> company[-1]
'd'
字符串可以直接进行索引,不需要通过变量进行引用
>>> 'hello'[1]
'e'
可以直接对函数调用的返回结果进行索引
>>> ready =raw_input('Are you ready?(yes or no)')[0]
Are you ready?(yes or no)yes
>>> ready
'y'
实战:编写一个代码程序,根据用户输入打印出时间日期
#!/usr/bin/python
#According to the given date(date) (month) (year) in the form of digital print out
months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December',
]
#With 1 ~ 31 number as the endof the list
endings = ['st','nd','rd'] +17 * ['th'] \
+ ['st','nd','rd'] + 7 *['th'] \
+ ['st']
year = raw_input('Year:')
month = raw_input('Month(1-12):')
day = raw_input('Day (1-31):')
month_number = int(month)
day_number = int(day)
#To months and days minus 1,in order to obtain the correct index
month_name =months[month_number-1]
ordinal = day +endings[day_number-1]
print "%s %s,%s" % (month_name,ordinal,year)
作业:
实战:创建一个商品页面,要求
1、显示商品名称和价格对应关系
2、获取用户工资水平
3、提供用户选择购买商品功能
4、用户购买完商品,显示用户账号余额
5、提示用户是否继续购买
脚本效果图