Python脚本-删除Windows上的换行符

第一个python脚本

在工作中,由于是在Linux服务器上开发,编译服务器当然也就是Linux了,但是我的电脑是windows系统,VIM这个编辑器有需要配置很多配置文件才能有强大的功能,所以我放弃了在服务器上使用VIM写代码,选择了在windows使用了VS code进行开发(毕竟我比较懒)。
由于操作系统的不同,代码中换行符也是不同的,这就导致有的代码编译不过,报的错误是行尾多了^M这个东西,这第一个脚本就是批量删除文件的^M。

引入标准库

对文件进行操作,所以引入os和sys库

1
2
3
4
#!/usr/bin/env python
#coding:utf-8
import os
import sys

获取目录下所有文件

因为需要批量处理文件,所以我们首先要保证可以得到目录下所有文件,这使用到了listdir()函数。

1
2
3
a = "./"
for f in os.listdir(a):
print f

运行会发现,我们只输出了当前目录的文件名和子目录名,我们来按下面方式优化一下:

  • 把对目录的操作写成函数。
  • 使用判断如果是目录就递归调用,这使用到了isdir()函数。
    1
    2
    3
    4
    5
    6
    7
    8
    def delete_func(p):
    for f in os.listdir(p):
    if os.path.isdir(f):
    delete_func(f)
    else:
    print f
    a = "./"
    delete_func(a)
    运行会发现,确实打印出来了。

为文件名添加路径

虽然获取了文件名,但是我们的工作目录还是在给的路径下,子目录里面操作不到,所以需要我们添加路径,这就用到了join()函数。

1
2
3
4
5
6
7
8
def delete_func(p):
for f in os.listdir(p):
if os.path.isdir(os.path.join(p,f)):
delete_func(os.path.join(p,f))
else:
print os.path.join(p,f)
a = "./"
delete_func(a)

清除^M

得到了文件后我们就可以清除^M了,我们可以通过调用Linux中的sed命令来清除,调用外部命令需要用到system()函数。

1
2
3
4
5
6
7
8
9
10
11
def delete_func(p):
for f in os.listdir(p):
if os.path.isdir(os.path.join(p,f)):
delete_func(os.path.join(p,f))
else:
cmd = "sed -i 's/\r//' " + os.path.join(p,f)
if os.system(cmd) == 0:
print "success delete " + os.path.join(p,f) + " ^M"

a = "./"
delete_func(a)

关于sed请看Linux命令-sed,使用system()后不要忘了判断是否执行成功。


优化

支持单文件清除

使用isfile()函数对参数进行判断,如果是文件直接清除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def delete_func(p):
if os.path.isdir(p):
for f in os.listdir(p):
if os.path.isdir(os.path.join(p,f)):
delete_func(os.path.join(p,f))
else:
cmd = "sed -i 's/\r//' " + os.path.join(p,f)
if os.system(cmd) == 0:
print "success delete " + os.path.join(p,f) + " ^M"
else:
cmd = "sed -i 's/\r//' " + p
if os.system(cmd) == 0:
print "success delete " + os.path.join(p) + " ^M"

a = "./os.py"
delete_func(a)

使用传入的路径

使用sys.argv[1]来获取传入的路径:

  • 首先判断参数是否大于两个。
  • 判断参数是否是文件或者目录中的一个。
  • 调用函数。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/usr/bin/env python
    #coding:utf-8
    import os
    import sys
    def delete_function(a):
    if os.path.isdir(a):
    for f in os.listdir(a):
    if os.path.isdir(os.path.join(a,f)):
    delete_function(os.path.join(a,f))
    else:
    cmd = "sed -i 's/\r//' " + os.path.join(a,f)
    if os.system(cmd) == 0:
    print "success delete " + os.path.join(a,f) + " ^M"
    else:
    cmd = "sed -i 's/\r//' " + a
    if os.system(cmd) == 0:
    print "success delete " + a + " ^M"

    if len(sys.argv) < 2:
    print "please input a path"
    sys.exit(0)
    if not (os.path.isfile(sys.argv[1]) or os.path.isdir(sys.argv[1])):
    print "please input a dir or file"
    else:
    delete_function(sys.argv[1])

总结

以上就是脚本的最终版本了,如果你需要同时处理多个不同的目录,就自己动手再优化一下吧。

(给个提示:遍历argv然后执行函数)


Python脚本-删除Windows上的换行符
https://carl-5535.github.io/2020/11/13/python脚本/Python脚本-删除Windows上的换行符/
作者
Carl Chen
发布于
2020年11月13日
许可协议