python语言temp_关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()

嗯。最近在弄的东西也跟这个有关系,由于c基础渣渣。现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白。

每个语言都有相关的文件操作。

今天在flask 的例子里看到这样一句话。拉开了文件操作折腾的序幕

db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()

稍微查询一下就能了解到 tempfile是一个临时文件模块。 包含了一些临时文件的操作

tempfile.mkstemp()

在很老很老的python版本的时候,第一个参数是返回的是安全等级,第二个参数是文件名称的绝对路径。这个很奇怪,应该是后面python版本对这个库有所改动。因为在查询的时候,发现很多地方都是这么写的返回。然而我调用了这个函数去看了函数内部实现的时候发现,其实并不是这样。

也就是说在我使用的python2.7版本tempfile.mkstemp()返回的第一个参数是一个fd(file_description)文件描述符,和一个包含绝对路径的文件名称。tempfile里面的有些方法创建的文件是在关闭之后会自动删除的,但是mkstemp()这个方法创建的临时文件并不会被删除,只是不会被其他应用程序找到和使用。你可以在使用之后通过os.close(fd)这个方法关闭这个文件。

顺便介绍一个tempfile.TemporaryFile()方法,他在创造了临时文件之后会在文件关闭之后销毁 可以尝试使用以下方法测试一下。

file_obj = tempfile.TemporaryFile(dir=os.path.dirname(__file__))

with file_obj as f:

f.write('123j12oi3joijw')

f.seek(0)print f.read()

会发现和tempfile.mkstemp()方法的行为不一样,文件看似并没有被创建,其实是创建了然后在关闭之后被销毁了。

这里不得不强调一个问题,也是最开始我也没有弄明白的问题。

我尝试使用这样的语句去操作一个fd

fd, name = tempfile.mkstemp(dir=os.path.dirname(__file__))

with fd as f:pass

Traceback (most recent call last):

File"/Users/piperck/Desktop/py_pra/laplace_pra/2016_01/2016_01_pra.py", line 11, in with fd as f:

AttributeError:__exit__

奇怪了,难道以前我用open生成的文件对象都不是fd? 这跟剧本不对啊。 于是我又去看了一下源码。。。还真不是一个东西

fd文件描述符和python的文件对象并不是一个东西。 只有python的文件对象才可以用相关方法进行操作。

我们平时使用的open方法是创建了一个可以被python语言操作的python file object。 并不是 fd对象。

python也提供了一个方法可以将fd对象转换成python文件对象 使用

python_file_obj = os.fdopen(fd,)

fdopen(fd, mode='r', bufsize=None)

对应的系统提供的os.fdopen的方法如上

可以这样说 fd对象是系统层面的东西,c语言里面也有。os.fdopen os.close(fd)等方法来操作fd对象。 而python文件对象就可以使用python文件操作的相关方法。嘿嘿 这下应该不会搞混了吧。

顺便推荐一篇文章:http://blog.csdn.net/dreamthen/article/details/17263259 介绍相关python文件操作的 分析得还蛮细的 我看了一下有些收益

-----------------------分割线-----------------------2016-02-01补充

今天研究一下对csv的读写问题,补充一张图

742678-20160201020224522-1518041479.jpg

注意注意,

这里文件操作,如果要在头部增加'BOM(\xef\xbb\xbf)'的话使用ab追加行不通,而且尝试了让文件指针回到头部 似乎也不行。a追加方式会自动让指针回到尾部造成操作失败。这里我们使用r+b进行操作。r追加操作既不会让指针跑到尾部去,而且也不会重写整个文件 是一个比较好的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化代码 def fault_classification_wrapper(vin, main_path, data_path, log_path, done_path): start_time = time.time() isc_path = os.path.join(done_path, vin, 'isc_cal_result', f'{vin}_report.xlsx') if not os.path.exists(isc_path): print('No isc detection input!') else: isc_input = isc_produce_alarm(isc_path, vin) ica_path = os.path.join(done_path, vin, 'ica_cal_result', f'ica_detection_alarm_{vin}.csv') if not os.path.exists(ica_path): print('No ica detection input!') else: ica_input = ica_produce_alarm(ica_path) soh_path = os.path.join(done_path, vin, 'SOH_cal_result', f'{vin}_sohAno.csv') if not os.path.exists(soh_path): print('No soh detection input!') else: soh_input = soh_produce_alarm(soh_path, vin) alarm_df = pd.concat([isc_input, ica_input, soh_input]) alarm_df.reset_index(drop=True, inplace=True) alarm_df['alarm_cell'] = alarm_df['alarm_cell'].apply(lambda _: str(_)) print(vin) module = AutoAnalysisMain(alarm_df, main_path, data_path, done_path) module.analysis_process() flags = os.O_WRONLY | os.O_CREAT modes = stat.S_IWUSR | stat.S_IRUSR with os.fdopen(os.open(os.path.join(log_path, 'log.txt'), flags, modes), 'w') as txt_file: for k, v in module.output.items(): txt_file.write(k + ':' + str(v)) txt_file.write('\n') for x, y in module.output_sub.items(): txt_file.write(x + ':' + str(y)) txt_file.write('\n\n') fc_result_path = os.path.join(done_path, vin, 'fc_result') if not os.path.exists(fc_result_path): os.makedirs(fc_result_path) pd.DataFrame(module.output).to_csv( os.path.join(fc_result_path, 'main_structure.csv')) df2 = pd.DataFrame() for subs in module.output_sub.keys(): sub_s = pd.Series(module.output_sub[subs]) df2 = df2.append(sub_s, ignore_index=True) df2.to_csv(os.path.join(fc_result_path, 'sub_structure.csv')) end_time = time.time() print("time cost of fault classification:", float(end_time - start_time) * 1000.0, "ms") return
05-28

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值