python修改文件格式为unix_软件测试技术之如何用python在Windows系统下,生成UNIX格式文件...

本文将带你了解软件测试技术之如何用python在Windows系统下,生成UNIX格式文件,希望对大家学测试技术有所帮助

如何用python在Windows系统下,生成UNIX格式文件

平时测试工作中,少不了制造测试数据。最近一个项目,我就需要制造一批可在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++创建文件并写入文本内容:

1   #coding:utf-8(设定文件编码格式)

2 import os

3 import time

4

5 #切换到创建文件目录

6   os.chdir(r"C:\Study\Chestnuts\01data")

7

8 #新建创建文件函数

9 def   create_file():

10

11     #构造文件名:以“年月日”为文件名的.dat文件

12       t=time.localtime()

13       file_name=time.strftime("%Y-%m-%d",t)+".dat"

14     #创建并打开文件

15       fp=open(file_name,'w+')

16     #写入文件内容

17       fp.writelines("12345\n")

18       fp.writelines("67890\n")

19     #关闭文件

20       fp.close()

21

22 #调用函数

23 create_file()

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

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

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

1 #coding:utf-8

2 import os

3

4 #文件路径准备

5   route=r"C:\Study\Chestnuts\01data"

6

7 #遍历路径下目录,文件夹,文件

8 for   root,dirs,files in os.walk(route):

9       #遍历文件

10     for   name in files:

11         #归纳文件名特征

12           if name[-3:]=='dat':

13             #拼接文件名(目录+文件名称)

14               catalog=os.path.join(root,name)

15             #把所有行分割符替换为换行符\n返回.

16               fp=open(catalog,"rU+")

17             #读取文件并保存

18               strings=fp.read()

19             fp.close()

20             #使用二进制写文件

21               fp1=open(catalog,"wb")

22             fp1.seek(0)

23               fp1.write(strings)

24             fp1.flush()

25             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)”进行提问,也可以来吴老的测试开发培训班一起学习。为了更全面的提升,为了更丰厚的待遇,也为了更美好的生活,让我们在光荣之路一起奋斗!

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标软件测试之测试技术频道!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ class和struct的区别

C中的 struct 和 class 的区别: 1 . 使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。 2 . class 继承默认是 private 继承,而 struct 继承默认是 public …

linux 宽字符串,C语言中的多字节字符与宽字符

C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。C95标准化了两种表示大型字符集的方法&am…

step7db块寻址_step7 根据db地址块怎样找I/O点

楼主是想在数据块DB中查找呢还是想在FC/FB或OB块中查找呢?如果是在数据块DB中查找,打开希望查找的数据块,例如打开数据块DB9,看地址处是1940的数据就是你需要找的DB9.DBD1940。如图1所示。如果是想查找FC/FB或OB块中DB9.DBD1940这…

vue 获取元素下的所有div_vue获取dom元素高度的方法

获取高度:要在钩子mounted里面dom结构生成后去获取dom的高度,宽度,修改样式等操作!!!mounted() {let h window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; //…

execl执行linux命令,execl执行Linux命令

相关函数:execle, execlp, execv, execve, execvp1.表头文件:#include 2.函数定义:int execl(const char *path, const char *arg, ...);execl()用来执行参数path字符串所代表的文件路径, 接下来的参数代表执行该文件时传递的argv…

C++函数编译原理和成员函数的实现

C函数的编译 C中的函数在编译时会根据命名空间、类、参数签名等信息进行重新命名,形成新的函数名。这个重命名的过程是通过一个特殊的算法来实现的,称为 名字编码(Name Mangling)。 Name Mangling 是一种可逆的算法,…

linux 运行选择哪个cpu核,判断Linux进程在哪个CPU核运行的方法

问题:有一个Linux进程运行在多核处理器系统上,如何查看该进程运行在哪个CPU上?方法一:ps 命令可以告诉你每个进程/线程目前分配到的(在“PSR”列)CPU ID。ps -o pid,psr,comm -p 运行结果:PID PSR COMM5357 10 prog输…

laravel 任务队列_laravel队列-让守护进程处理耗时任务

待解决的问题最近在做一个服务器集群管理的web项目,需要处理一些极其耗时的操作,比如磁盘格式化分区。对于这个需求,最开始的想法是,为了让节点上的rpc(远程过程调用) service端尽可能简单(简单到只需要popen执行一条指令即可&…

C++对象数组

对象数组是什么 数组对象就是大批量实例化对象的一种方法,例如:Student stu 实例化对象,如果有好几百个对象应该怎么办?这时候就用到了对象数组,顾名思义,就是吧所有要实例化的对象都放到一个组里面&#…

镜像安装linux选择内核版本,在CentOS和Ubuntu中安装Linux Kernel 4.13.10

Linus Torvalds 在 10 月 17 日星期五正式发布了稳定版 Linux Kernel 4.13.10,这个最新版本发布了新功能,进行了诸多修复和问题改进。下面将向大家介绍在 CentOS 和 Ubuntu 中手动安装、更新 Linux Kernel 4.13.10 的方法,当然,这…

C++成员对象和封闭类

有其他类的对象作为 成员对象的类叫封闭类。 任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。 具体做法是通过封闭类的构造函数的初始化列表。 封闭类对象生成时,先执行所有对象成员的构造函数&a…

linux设备进入睡眠所需时间,android linux 休眠 深度睡眠 查看 方法 调试【转】

在Android移动设备中,有时按下Power键(未接电源,USB)时,因其它apk程序获取了wake_up锁未释放或程序BUG导致未释放,造成未能进入深度睡眠,从而加大了耗电量,减少了待机时间,参考如下图&#xff0…

kali 邮箱攻击_kali下邮件发送工具swaks入坑

Swaks是一个功能强大,灵活,可编写脚本,面向事务的SMTP测试工具,目前Swaks托管在私有svn存储库中。官方项目页面是牛刀小试kali下默认自带,无需安装。01 测试邮箱的连通性swaks --to xxxxxxqq.com返回250ok,…

C++引用浅析

C 中,有一种比指针更加便捷的传递聚合类型数据的方式,那就是引用(Reference)。 在 C/C 中,我们将 char、int、float 等由语言本身支持的类型称为基本类型,将数组、结构体、类(对象)等…

linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程

#include#define ERR_EXIT(m)do {perror(m);exit(EXIT_FAILURE);} while(0)int setup_daemon(int, int);/* 守护进程一直在后台运行且无控制终端 */int main(int argc, char *argv[]){// daemon(0, 0)setup_daemon(0, 0);printf("test ..."); // 无输出for(;;) ;ret…

arduino 温度调节器_Arduino用温湿度传感器控制继电器,为什么点了串口助手才能运行,拔掉usb线,直接外界9V电源却用不了...

用温湿度传感器控制继电器,为什么点了串口助手才能运行,拔掉usb线,直接外界9V电源却用不了,以下是程序,目的是在湿度达到40%的时候继电器吸合,45%后,继电器断开,求各位大神指教...用…

C++中指针与引用的区别

指针的本质 指针p也是对象,只不过p存储的数据类型是它所指的对象的地址。可以通过解引用操作符“”来访问对象的值,即p。 对象有常量(const)和非常量之分,如果指针本身是常量,即指针常量,指这…

python支持按指定字符串分割成数组_python – 如何切割numpy数组字符串的每个元素?...

这是一个矢量化的方法 –def slicer_vectorized(a,start,end):b a.view(S1).reshape(len(a),-1)[:,start:end]return np.fromstring(b.tostring(),dtypeSstr(end-start))样品运行 –In [68]: a np.array([hello, how, are, you])In [69]: slicer_vectorized(a,1,3)Out[69]:ar…

数据库的概念

数据存储方式 计算机数据(Data)的存储一般以硬盘为数据存储空间资源,从而保证计算机内的数据能够持续保存。对于数据的处理,一般会采用数据库相关的技术进行处理,从而保证数据处理的高效性。 采用数据库的管理模式不…

高中关于人工智能方面的课题_2019山东人工智能教育专项课题指南选题

人工智能教育专项课题,2019年度山东省教育规划课题已经启动,申报者有这方面的申报意向,就需要知道选题范围,以下是2019山东人工智能教育专项课题指南选题。小学人工智能教育课程体系、教学策略及教学评价的研究初中人工智能教育课…