问题现场:
写了一个demo.py,目的是读两个文件x和y,提取两个文件中的某个字段,比较大小,然后将结果保存到一个res.txt的文件中。
demo.py内容如下:
# -*- coding: utf-8 -*-
import json
import sys
import os
file = open('y', 'r')
log_dict = {}
for line in file:
json_str = json.loads(line)
log_dict[json_str['2001']] = json_str['duration']
files = open('x', 'rw')
filename = 'res.txt'
if not os.path.exists(filename):
os.system(r"touch {}".format(filename))#调用系统命令行来创建文件
res = open(filename, 'rw')
ch_large_cnt = 0
ch_cnt = 0
for line in files:
ch_cnt = ch_cnt + 1
line = line.replace('\n', '') # line.strip() # 把末尾的'\n'删掉
line_list = line.split('\t')
line_list.append(log_dict[line_list[3]])
if float(line_list[4]) - float(log_dict[line_list[3]])/1000 > 0.1:
line_list.append('1')
ch_large_cnt = ch_large_cnt + 1
else:
line_list.append('0')
new_line = line + '\t' + log_dict[line_list[3]] + '\t' + line_list[6] + '\n'
print new_line
res = open(filename, 'r')
res.write(new_line)
res.close()
报错:
Traceback (most recent call last):
File "/Users/wang/PycharmProjects/testPro/test.py", line 31, in <module>
res.write(new_line)
IOError: File not open for writing
原因:
往res.txt中写文件时,open()函数的参数有误。open(filename, 'r') --->open(filename, 'w')或者open(filename, 'a')
补充:打开和关闭文件
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。
open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
常用的几个模式:
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。