0%

python批量操作文件

利用python批量改变文件编码格式、复制文件、将txt文件写入docx文件。

批量改变文件编码格式

在使用github制作网站时,发现上传的txt文件打开后是乱码,而在本地预览时是正确的。原因是我上传的txt文件内容是中文,编码格式是ANSI,需要改成utf-8后再上传。
修改单个文件编码格式很简单,用记事本打开txt文件,点击左上方文件,选择另存为,下方的编码选择UTF-8
当有几百上千个文件时,就需要利用程序批量处理。我采用的方法是:将原文件夹内所有的文件以UTF-8复制到新文件。
示例:将C:/文件/12文件夹内的所有txt文件,以UTF-8复制到C:/Users/liyil/Desktop/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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import os

# ANSI转utf-8
def convert(oldfile, newfile):
file = open(oldfile, "r") # 打开原文件
data = file.read() # 读取原文件数据
file.close()

# 打开目标路径,如果有txt文件就写入,没有就自动新建
file_copy = open(newfile, "w", encoding="utf-8") # 以utf-8编码写入复制的数据
file_copy.write(data)
file_copy.close()


def travel(olddirpath, newdirpath):
i = 0 # 计数
for root, dirs, files in os.walk(olddirpath):
for dir in dirs:
olddirpath = os.path.join(root, dir)
newdir = newdirpath + olddirpath[8:] # 截取路径
os.mkdir(newdir) # 复制文件夹

for file in files:
if os.path.splitext(file)[1] == ".txt": # 只修改txt格式的文件
oldfilepath = os.path.join(root, file)
print("oldfilepath: %s" % oldfilepath)
i = i + 1

newfilepath = newdirpath + oldfilepath[8:] # 截取路径
print("newfilePath: %s" % newfilepath)

convert(oldfilepath, newfilepath)
print("")
print(i) # 统计一共修改了多少文件


oldDirPath = "C:/文件/12"
newDirPath = "C:/Users/liyil/Desktop/1" # 需要手动新建此文件夹
travel(oldDirPath, newDirPath)

修改编码格式后上传至github,能正确显示中文,但是本地预览又是乱码。

批量复制文件

python可以复制图片、视频、pdf、txt等文件,一般用"rb"、"wb"以二进制方式打开与写入。对于中文的utf-8文档,也可以用open(file, “r”, encoding=“utf-8”)打开。
遍历函数travel()与上面的程序差不多,主要的copy()函数很简单。完整代码如下:

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
26
27
28
29
30
31
32
33
34
import os


def copy(oldfile, newfile):
file = open(oldfile, "rb")
date = file.read()
file.close()

file_copy = open(newfile, "wb")
file_copy.write(date)
file_copy.close()


def travel(olddirpath, newdirpath):
for root, dirs, files in os.walk(olddirpath):
for dir in dirs:
olddirpath = os.path.join(root, dir)
newdir = newdirpath + olddirpath[8:] # 截取路径
os.mkdir(newdir) # 新建文件夹

for file in files:
oldfilepath = os.path.join(root, file)
print("oldfilepath: %s" % oldfilepath)

newfilepath = newdirpath + oldfilepath[8:] # 截取路径
print("newfilePath: %s" % newfilepath)

copy(oldfilepath, newfilepath)
print("")


oldDirPath = "C:/文件/12"
newDirPath = "C:/Users/liyil/Desktop/1" # 需要手动新建此文件夹
travel(oldDirPath, newDirPath)

批量将txt文件写入docx文件

如果直接将文件后缀txt改为docx,会发现不能正确打开文件,需要将txt文件内容重新写入docx文件。先安装python-docx库,命令:
pip install python-docx
完整代码如下:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import os
from docx import Document
from docx.oxml.ns import qn


def convert(oldfile, newfile):
with open(oldfile, "r", encoding="utf-8") as txt: # 打开原txt文件
data = txt.read().splitlines() # 去除换行符

document = Document()
for line in data:
document.add_paragraph(line) # 写入docx

document.styles["Normal"].font.name = u"楷体"
document.styles["Normal"]._element.rPr.rFonts.set(qn("w:eastAsia"), u"楷体")

document.save(newfile) # 保存至docx


def travel(olddirpath, newdirpath):
for root, dirs, files in os.walk(olddirpath):
for dir in dirs:
olddirpath = os.path.join(root, dir)
newdir = newdirpath + olddirpath[8:] # 截取路径
os.mkdir(newdir) # 新建文件夹

for file in files:
oldfilepath = os.path.join(root, file)
print("oldfilepath: %s" % oldfilepath)

newfilepath = newdirpath + oldfilepath[8:] # 截取路径
newfilepath = newfilepath.replace(".txt", ".docx") # 换格式
print("newfilePath: %s" % newfilepath)

file = open(newfilepath, "w") # 在目标路径里新建docx文件
file.close()

convert(oldfilepath, newfilepath) # 写入
print("")


oldDirPath = "C:/文件/12"
newDirPath = "C:/Users/liyil/Desktop/1" # 需要手动新建此文件夹
travel(oldDirPath, newDirPath)