您的位置:首页 > 其它

使用for,while循环遍历文件

2017-12-28 20:07 381 查看
一、使用for循环来打开文件

1.对文件进行操作我们需要用到open模块。

(1)open模块的用法:open(name(文件名,最好用绝对路径)[mode(以什么模式打开),buffering(缓存)]) 他返回的是一个文件对象。

(2)mode 模式:

1.r: 以只读模式打开 只能读,不能写,必须打开一个存在的文件,如果文件不存在会报错。

2.w:以写模式打开 如果文件不存在则创建,如果文件存在,会覆盖文件内容。所以要小心使用写模式。

3.a:以追加模式打开 如果文件存在,会在文件最后追加内容。如果文件不存在也会创建。

4.r+:以读写模式打开

5.w+: 以读写模式打开,和w模式类似。慎用。

6.a+ :以读写模式打开,和a模式类似。

7.rb : 以二进制读模式打开

8.wb: 以二进制写模式打开 和w模式类似

9.ab:以二进制追加模式打开 和a模式类似

10rb+: 以二进制读写模式打开 和r+模式类似

11.wb+:以二进制读写模式打开 和w+类似

12.ab+:以二进制读写模式打开 和a+类似

2.open模块的方法和用法

1.用法open('/root/1.txt') 如果是当前路径可以直接写文件名,如果不是写绝对路径。



可以看到返回的是一个文件对象 如果没指定模式的话,默认是以只读模式打开。

可以使用一个变量接收一下,通常这个变量叫做文件描述符。

fd = open('1.txt')

typt(fd)



类型是file.

2.open 里的方法

(1)close()方法:关闭文件描述符。关闭后不再访问文件。

fd.close()

如果在读取数据就会报错:



(2).write方法:写入文件,这个方法不是是只读模式打开。

写入的东西,必须是字符串其他都不接受,会报错。

fd.write('abc')

fd.close()



当写入完成后,必须close 关闭文件后才能显示,写入的内容,如果文件已存在,会覆盖原有内容。

(3)read()方法:对文件从头读到尾

fd.read() 返回字符串。



可以发现,read()方法在执行一次就不会出现内容了,这是因为read是从头读到尾的,当读完了以后,指针停在了末尾,已经没有任务内容了,所以显示为空。

如何移动指针呢,在后期会使用到seek()方法,和tell()方法。

fd.read(2) 这样可以指定读几个字符。指针从第一位读到第二位。





不加就是从头读到尾

(4)readline()方法: 读一行内容,返回字符串。

fd.readline()



(5)readlines()方法:读多行内容,并且返回的是一个list 列表,每一行的内容为一个元素,

fd.readlines()



一般读文件主要就是这3种方法。

(6)next()方法:类似readline 也是读取一行。

二、使用for循环来读文件

1.例子
fd = open('1.txt')for a in fd.readlines()print afd.close()



readlines()有个特点,就是会在每一行的最后加上一个换行符。



对比一下源文件,会发现输出的每一行下面多了一个空行。如果要消除这个空行只要加一个, 因为print 默认也会输出一个换行。就有了2个换行了

fd = open('1.txt')

fd.close()

for a in fd.readlines()

print a,



用这种方式的话有一个问题,如果这个文件很大,几个G。在定义变量的时候不会产生多大内存,只在内存中创建了一个对象,当执行到readlines的时候,会产生一个list,当几个G 的内容在list中,会占用大量内存。不建议这么写。

推荐这种写法:

fd = open('1.txt')

fd.close()

for a in fd

print a,



可以看到和readlines 输出的结果没什么区别,这为什么也可以呢?

这是因为fd是个对象,就像xrange一样。遍历一次,就取里面的一行,不会像readlines那样先生成一个大列表。不占用内存。建议以后对文件做遍历用这种写法

三、使用while循环来遍历文件.
1.如何使用while循环遍历文件
fd = open('1.txt')

fd.close()

while True:

line = fd.readline()

if not line: #not line 也就是true。当最后一行为空为真的时候,结束循环。

break

print line

fd.close()



2.with open 用法
with open 的使用和open 一样,用with open 可以不用关闭文件也就是不用close()
with open('1.txt') as fd

while True:

line = fd.readline()

if not line: 。

break

print line



可以看到结果是一样的。

with open的语法 和if for while 相似, 在他后面的代码块也是需要缩进的。

用法是:with open('filename') as fd:

这里的as 就相当于是赋值变量。和 fd = open('filename') 一样

使用with open语法呢,是不需要close()的,当代码块执行完最后一行,缩进和with open在一行的时候,默认就关闭了文件。

习题

1. 现有一个文件test.txt ,内容如下:

1234efgh

abcd5678

要求读出文件内容,对内容的顺序进行编辑,然后重新写入到文件,使其为如下形式

12345678

abcdefgh

注意事项:使用pycharm的同学在调试程序时,如果程序对文件进行了操作,然后手动修改了文件,则要在pycharm中,程序所在的目录上点击右键,选择clean python compiled files,否则可能会报错

list1 = list()
with open('test.txt') as fd:
for line in fd.readlines():
list1.append(line)
a = list1[0][0:4] + list1[1][4:]
#对list1进行切片 按要求来排顺序 把第一个元素和第二个元素加在一起。
b = list1[1][0:4] + list1[0][4:]
with open("test.txt",'w') as fd:
fd.write("{0}\n".format(a))
fd.write(b)
2. 将上周五生成的dict3,排序后写入到文件dict.txt中,要求格式为

A 65

B 66

C 67

...

x 120

y 121

z 122

dict3 = {
'A': 65,
'B': 66,
'C': 67,
'D': 68,
'E': 69,
'F': 70,
'G': 71,
'H': 72,
'I': 73,
'J': 74,
'K': 75,
'L': 76,
'M': 77,
'N': 78,
'O': 79,
'P': 80,
'Q': 81,
'R': 82,
'S': 83,
'T': 84,
'U': 85,
'V': 86,
'W': 87,
'X': 88,
'Y': 89,
'Z': 90,
'a': 97,
'b': 98,
'c': 99,
'd': 100,
'e': 101,
'f': 102,
'g': 103,
'h': 104,
'i': 105,
'j': 106,
'k': 107,
'l': 108,
'm': 109,
'n': 110,
'o': 111,
'p': 112,
'q': 113,
'r': 114,
's': 115,
't': 116,
'u': 117,
'v': 118,
'w': 119,
'x': 120,
'y': 121,
'z': 122}
dict3 = sorted(dict3.items(), key=lambda item: item[1])
with open("1.txt",'w') as fd:
for i in dict3:
a = i[0]
b = str(i[1])
fd.write("{0} {1}\n".format(a,b))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: