一、使用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') 如果是当前路径可以直接写文件名,如果不是写绝对路径。

python循环读取图片路径 python循环遍历文件内容_python循环读取图片路径

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

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

fd = open('1.txt')

typt(fd)

python循环读取图片路径 python循环遍历文件内容_字符串_02

类型是file.

2.open 里的方法

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

fd.close()

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

python循环读取图片路径 python循环遍历文件内容_for循环_03

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

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

fd.write('abc')

fd.close()

python循环读取图片路径 python循环遍历文件内容_bc_04

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

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

fd.read() 返回字符串。

python循环读取图片路径 python循环遍历文件内容_python循环读取图片路径_05

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

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

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

python循环读取图片路径 python循环遍历文件内容_for循环_06

python循环读取图片路径 python循环遍历文件内容_python循环读取图片路径_07

不加就是从头读到尾

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

fd.readline()

python循环读取图片路径 python循环遍历文件内容_字符串_08

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

fd.readlines()

python循环读取图片路径 python循环遍历文件内容_for循环_09

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

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

二、使用for循环来读文件

1.例子

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

python循环读取图片路径 python循环遍历文件内容_bc_10

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

python循环读取图片路径 python循环遍历文件内容_字符串_11

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

fd = open('1.txt')

fd.close()

for a in fd.readlines()

print a,

python循环读取图片路径 python循环遍历文件内容_字符串_12

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

推荐这种写法:

fd = open('1.txt')

fd.close()

for a in fd

print a,

python循环读取图片路径 python循环遍历文件内容_字符串_13

可以看到和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()

python循环读取图片路径 python循环遍历文件内容_字符串_14

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

python循环读取图片路径 python循环遍历文件内容_bc_15

可以看到结果是一样的。

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))