平时测试工作中,少不了制造测试数据。最近一个项目,我就需要制造一批可在UNIX下正确读取的文件。为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是Dos\Windows下的CRLF。”

  换行,在普通文档编辑中,就是按下“Enter”键。在编写代码时,就是在文件中写入字符串”\n”。但用python命令w在文件写入换行”\n”以后,由于是Windows系统的原故,会默认把”\n”实际保存为”\r\n”。

  对于Windows下为何是”\r\n”,这里引用网上的解释:因为Windows采用了传统的英文打字机模式,它在换行时需分解成两步——回车”\r”和换行”\n”。回车(carriage return,CR)是将小车退回至起点,相当于把光标从行尾切换到行首,换行(line feed,LF)是将小车切换到下一行,这样的组合操作就完成了另起一行的目的。

  我们首先确认Windows下的换行是否真的是CRLF:把文件用任意一款文本编辑器(以Notepad++为例)打开,在编辑器的菜单栏中,找到“视图”菜单,点击“显示符号”,勾选“显示所有字符”,就可以显示换行符了。我们在下图中可以看到,在Windows系统下,文件中的换行符确实是CRLF。

  

  如何把CRLF变成LF呢?开发给出了一个解决方案。

  Method A:

  在Notepad++界面右下角,双击当前文件格式的描述:“Dos\Windows”,点击弹框中的“转换为UNIX格式”,最后保存文件。此时可以看到文件每行结尾都已经展示为“LF”了。

  

  虽然整个转换过程极为简单,但要是有一大批这样的文件需要一个个手动转换,我不禁感慨光(xīn)阴(hǎo)虚(lèi)度,韶(bù)光(xiǎng)易(dòng)逝。

  在表达抗议后,开发表示可以优化此方法,即使用文本编辑器的替换功能:

  Method B:

  使用Notepad++打开原文件,按下组合键Ctrl+F后,在弹框中选择“替换”栏,在“查找目标”输入框填写“\r\n”,“替换为”输入框填写“\n”,“查找模式”选择“扩展(\n\r\t\0\x...)”,点击“替换所有打开文件”后,一一保存文件即可。

  然而把所有的文件保存一遍,并不能提升测试的幸福感。我追求的是尽量减少重复而繁重的手工劳动,解放双手,高效测试!类似这样的能力瓶颈,从我进入测试行业开始,就不断挤占着我的业余时间。为了更好的提高自己,系统地学习测试开发所必需的技能,我报名参加了吴老的测试开发培训班。

  截至目前,吴老已经授课两个多月,我从无到有,学习了很多基本的python开发知识,也偶尔能接触到一些巧妙的编程思维。正好这次的数据准备,给我提供了一个实践的契机,让我运用最近学习的文件操作知识,体验了一次局部自动化的乐趣。

  下面给大家分享一下我这次愉快的实践内容,由于真实的测试数据略有复杂,这里就用简单的两行数字来举个栗子。

  首先按上课所讲的内容,依葫芦画瓢,使用Notepad++创建文件并写入文本内容:

 #coding:utf-8(设定文件编码格式)
import os
import time #切换到创建文件目录
os.chdir(r"C:\Study\Chestnuts\01data") #新建创建文件函数
def create_file(): #构造文件名:以“年月日”为文件名的.dat文件
t=time.localtime()
file_name=time.strftime("%Y-%m-%d",t)+".dat"
#创建并打开文件
fp=open(file_name,'w+')
#写入文件内容
fp.writelines("12345\n")
fp.writelines("67890\n")
#关闭文件
fp.close() #调用函数
create_file()

  如上图所示,执行脚本就会生成一份原始文件,不过在两行内容的末尾,换行符均显示为CRLF,接下来就是转换的工作了。

  Method C:对原文件进行格式转换

  如果是对现有的文件进行处理,可以使用Notepad++再编写一个转换的脚本。参考网上的方法,使用rU方式读取文件内容,使用wb方式写入文件内容,如下图所示:

 #coding:utf-8
import os #文件路径准备
route=r"C:\Study\Chestnuts\01data" #遍历路径下目录,文件夹,文件
for root,dirs,files in os.walk(route):
#遍历文件
for name in files:
#归纳文件名特征
if name[-3:]=='dat':
#拼接文件名(目录+文件名称)
catalog=os.path.join(root,name)
#把所有行分割符替换为换行符\n返回.
fp=open(catalog,"rU+")
#读取文件并保存
strings=fp.read()
fp.close()
#使用二进制写文件
fp1=open(catalog,"wb")
fp1.seek(0)
fp1.write(strings)
fp1.flush()
fp1.close()

  执行这个脚本,就能对现有文件格式进行转换,得到换行符是LF的文件了。

  结果是对了,但执行两个脚本来生成一份最终文件,难免让我觉得还不够简单。我分析了以上文件转换的代码,发现关键步骤是使用二进制(wb)方式写入文件。

  Method D:原文件使用二进制方式写入

  既然这样,不如在一开始就使用二进制写文件,一步到位!并且只需把源代码中写入方式(w)变成二进制写入(wb)方式即可。你看,仅仅添加了一个字母,就省去了十几行代码,还达到了预期目标,可谓一举多得!

#coding:utf-8(设定文件编码格式)
import os
import time #切换到创建文件目录
os.chdir(r"C:\Study\Chestnuts\01data") #新建创建文件函数
def create_file(): #构造文件名:以“年月日”为文件名的.dat文件
t=time.localtime()
file_name=time.strftime("%Y-%m-%d",t)+".dat"
#创建并打开文件
fp=open(file_name,'wb+')
#写入文件内容
fp.writelines("12345\n")
fp.writelines("67890\n")
#关闭文件
fp.close() #调用函数
create_file()

  窥一斑而见全豹,以上的代码优化,提醒我编程时需要多思考,理清逻辑,最终找到达成目标的最佳方案。在练习编写代码时,不仅要认真分析需求,分解步骤,也要注意积累好的方法进行沉淀,这也是我写下本文的目的所在。

  如果大家在测试工作中,也遇到了类似的困难,觉得自己能力欠缺,期望通过自己编写代码解决问题,欢迎大家咨询我或者吴老。可以加入我们的“光荣之路python群(457561756)”进行提问,也可以来吴老的测试开发培训班一起学习。为了更全面的提升,为了更丰厚的待遇,也为了更美好的生活,让我们在光荣之路一起奋斗!

作者:Flyleaves
出处:http://www.cnblogs.com/Flyleaves/
本文版权归作者、微信公众号光荣之路和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如何用python在Windows系统下,生成UNIX格式文件的更多相关文章

  1. windows系统下使用bat脚本文件设置 JDK 系统环境变量

    号开头的行不要写在bat文件中 # java_init.bat # 注意文件换行符是windows系统下的(CR LF),文件编码是ANSI # path变量追加这个可以拓展到tomcat,mysql ...

  2. [经验分享]Windows系统下生成IOS证书

    我使用ApiCloud开发APP,开发后需要生成IOS的证书才能在项目开发控制台中进行编译,于是我在网上大海捞针似的寻找办法. 官方文档提供了使用苹果系统下生成IOS证书的步骤,对于我这个没有imac ...

  3. [转]Windows系统下批量重命名文件(bat命令版本)

    原文地址:https://jingyan.baidu.com/article/6dad507524bdcba122e36e44.html 我们有时候会遇到大量文件需要重命名,Windows系统下右键菜 ...

  4. python 替换windows换行符为unix格式

    windows 默认换行符为 \r\n; unix默认换行符为 \n; 所以当win下编辑的脚本在linux下显示末尾多了^M: 换行符修改为同一的unix格式脚本如下: def run(path,f ...

  5. Python学习—(windows系统下)安装pygame

    浏览器搜索pygame的windows安装程序,下载与python版本相匹配的文件. 如果.exe文件直接运行: 如果.whl文件,将其复制到要用到的项目文件夹中,在cmd窗口中切换到该文件所在的文件 ...

  6. python起步--windows系统下安装python解释器和PyCharm

    参考教程: 1)https://www.runoob.com/w3cnote/pycharm-windows-install.html 2)https://blog.csdn.net/c_shell_ ...

  7. windows系统下使用bat脚本文件设置MySQL系统环境变量

    说明:在一个bat文件中设置tomcat环境变量后,不能直接使用,需要另起一个bat文件才能使用 号开头的行不要写在bat文件中 # 这个bat文件实现的功能:设置环境变量 @echo off set ...

  8. windows系统下使用bat脚本文件设置 tomcat 系统环境变量

    说明:在一个bat文件中设置tomcat环境变量后,不能直接使用,需要另起一个bat文件才能使用 号开头的行不要写在bat文件中 # tomcat1.bat # 这个bat文件实现的功能:设置环境变量 ...

  9. 如何在Windows系统下使用you-get下载网上的媒体资源

    关于you-get的专业介绍可以点击这个链接:中文说明 1,首先你要在你的电脑上安装python环境 Windows系统下: 首先,你需要去官网下载相应的版本: 也可以下载我网盘里的(注意看好自己的电 ...

随机推荐

  1. 【C#公共帮助类】JsonHelper 操作帮助类, 以后再也不用满地找Json了,拿来直接用

     四个主要操作类:JsonConverter .JsonHelper .JsonSplit .AjaxResult 一.JsonConverter: 自定义查询对象转换动态类.object动态类转换j ...

  2. .NET多线程总结和实例介绍

    摘要:.Net提供了许多多线程编程工具,可能是因为太多了,所以掌握起来总是有一些头疼,我在这里讲讲我总结的一些多线程编程的经验,希望对大家有帮助. 1.多线程的总结 不需要传递参数,也不需要返回参数 ...

  3. 利用SCORE法则来总结一次偷懒的单元测试过程

    最近遇到一个单元测试的问题,本周正好学个了一个SCORE法则,这里正好练练手应用此法则将问题的前因后果分享给大家. S:背景  代码要有单元测试,检测的标准就是统计代码的单元测试覆盖率,程序员需要达到 ...

  4. getElementById() getElementsByTagName() getElementsByClassName() querySlector() querySlectorAll()区别

    1. getElementById() getElementsByTagName()  javascript原生的方法,这两个不会有兼容性问题. 2. getElementsByClassName() ...

  5. Mvc传值

    提到Mvc传值我想大多数人想到的是ViewBag,自3.0之后在控制器与视图之间传值绝大多数传值用到的对象就是ViewBag.对于笔者以前做过的一些小的项目,貌似不需要考虑什么,但对于稍微大些的项目涉 ...

  6. SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试(转)

    原文地址:http://www.cnblogs.com/downmoon/archive/2012/04/19/2456451.html 在<SQL Server 2012服务端使用OFFSET ...

  7. 深入JavaScript:词法分析、连续赋值猜想

    JavaScript:词法分析.连续赋值猜想 原创文章,转摘请注明出处:苏福:http://www.cnblogs.com/susufufu/p/5851642.html 深夜发文,先吐槽下博客园的编 ...

  8. SAP Fiori和UI5的初学者导航

    你是UI5和Fiori的新手?来对地方了. 对我来说,今年是不得不“跟上时代”去提升自己ABAP世界以外的技术技能的困难的一年.幸运的是,有很多可免费获得的信息和课程可以帮你实现这个跳跃.不要等着别人 ...

  9. Day Tips:alertstemplates.xml

    1.修改Alert邮件模板,首先要注意的时候最好复制一份alertstemplates.xml,然后改一下名字,我改的是 custom_alertstemplates.xml,修改自己需要的代码部分. ...

  10. Visual Studio 2013 Update 2 RTM 发布

    今天,微软再Visual Studio Blog发布了开放Visual Studio 2013 Update 2 RTM 下载的文章. 原来安装RC版本的同志们可以直接安装,提供在线安装和ISO下载安 ...