使用for,while循环遍历文件

一、使用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 a
fd.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))



  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值