python写文件报错:IOError: [Errno 9] Bad file descriptor

本文介绍了一个Python脚本,旨在对比两个文件中的数据并记录结果。详细解析了使用Python进行文件读写操作的常见错误,特别是关于文件打开模式的不当使用导致的写入失败问题,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题现场:

写了一个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+    打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值