• 今天要处理一份报告docx文件,80页左右,格式如下这个样子

    • avatar
  • 我想python处理这些数据,但不好读取,我分析了一下

  • 复制到excel中,再转成csv文件

    • avatar
  • 根据文本特点,按”,,,,,,\n,,,,,,”分割觉得不错

    • 分割后,0和1,2和3等是一个表的
    • 用”% 2 == 0”和分开
      1
      2
      3
      # 处理不需要的端口
      port_list = ["21","22","3389"]
      for data in t_data:
  • 将需要的数据用split切割出来后,用”,”拼接,再存成CSV文件

  • 我用的读文件方式是all_data = f.readlines(),这要用全局变量,堆栈存不了这么大的数据

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

def parse_data(data_list):
    l_data = len(data_list)
    cnt_data = []
    t_str = ""
    for i in range(l_data):
        if i % 2 == 0:
            ip = data_list[i].split(",,,,,,\n")[0][1:]
            sys_os = data_list[i].split(",,,,,,\n")[1].split(" 设备类型")[0].split(":")[1]
            if sys_os == " ":
                sys_os = "其它"
            t_str = ip + "," + sys_os + ","
        else:
            temp = data_list[i].split("\n")
            t_data = temp[2:-1]
            port_list = ["21","22","3389"] # 不需要的端口
            flag = 0
            for data in t_data:
                t_port = data.split(",")[0]
                if t_port not in port_list:
                    data = data.replace(",",",") # 换成中文的逗号避免影响CSV
                    t_str = t_str + data + ","
                    flag = 1
            if flag == 0:
                continue # ip 对应的 data 为空(没有需要的端口)
        if i%2==1:
            cnt_data.append(t_str) # 第次为奇数时为一个表
            t_str = ""
    return cnt_data

path = r"数据2.csv"
with open(path,"r+") as f:
    all_data = f.readlines()
    all_data = "".join(all_data)
    s = ",,,,,,\n,,,,,,"
    data_list = all_data.split(s)

cnt_data = parse_data(data_list)
with open("tttttemp_new_data.csv","w+") as f:
    for data in cnt_data:
        data += "\n"
        f.write(data)