注册 登录
编程论坛 Python论坛

批量将TXT文件转换成CSV文件的问题

哈一耶 发布于 2023-03-22 14:55, 392 次点击
在网上下了一个TXT转CSV的脚本,运行以后显示“!debugfile('D:/spyderlianxi/data_from_test_txt/txt csv1.py', wdir='D:/spyderlianxi/data_from_test_txt')”,没有在相应文件夹输出CSV文件,
在百度上搜了两天,也没发现什么地方出了问题,请高手赐教,谢谢。
下面是代码
import os
import csv

def txt_data_to_csv(path,save_dir):
   
    """
    该函数实现将txt文件中的数据存储在csv文件中
    思路:
    1.按行读取txt文件
    2.去除每行数据两边的空格
    3.使用split()去除字符串中的空格,形成列表
    4.将列表元素提取存储在新列表
    5.将新列表数据写入csv文件中
    """
    files= os.listdir(path)         #遍历文件夹中的所有文件,将文件名存储在列表中
    for file in files:              #遍历文件夹中的txt文件
        file_path = os.path.join(path,file)
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        save_path=os.path.join(save_dir,'数据提取'+'from'+'_'+file+'.csv')
        if os.path.exists(save_path):
            os.remove(save_path)         #如果已经存在该文件夹,移除
        x_list=[]                        #新建空列表用于存储数据
        y_list=[]
        with open(file_path,'r') as f:   #打开txt文件
            lines=f.readlines()          #按行读取文件,并按行存储为列表
            for line in lines:           #遍历存储了文件信息的列表
                line = line.strip()      #去掉每个元素中的前后空格
                #print(line)
                if line!='@Phi=0.0':
                    xy=line.split()      #将txt文件中每行的空格去掉
                    x_list.append(xy[0]) #提取txt文件每行的第一个元素
                    y_list.append(xy[1]) #提取txt文件每行的第二个元素
            rows = zip(x_list,y_list)    #将列表按列存储
            with open(save_path, "w", newline='') as f:
                writer = csv.writer(f)
                for row in rows:
                    writer.writerow(row)

path=r'D:\spyderlianxi\data_from_test_txt'        #txt文件所在文件夹路径
save_dir=r'D:\spyderlianxi\data_from_test_txt'    #csv文件存储所在文件夹
#txt_data_to_csv(path,save_dir)
25 回复
#2
阳光上的桥2023-03-22 16:11
我理解就是把TXT文件的空格替换为逗号、只要前两列、跳过特殊行,文件转换部分可以单独定义一个子程序:
程序代码:

def txt2csv_file(txtname,csvname):
    txtf = open(txtname,'r')
    csvf = open(csvname,'w')
    while True:
        line = txtf.readline()
        if len(line)==0:
            break
        line = line.strip()
        if line == '@Phi=0.0':
            continue
        arr = line.split()
        if len(arr) > 1:
            csvf.write(arr[0] + ',' + arr[1] + '\n')
    txtf.close()
    csvf.close()


那么现在的子程序txt_data_to_csv可以简化为:
程序代码:

def txt_data_to_csv(path,save_dir):
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    files= os.listdir(path)
    for file in files:
        file_path = os.path.join(path,file)
        save_path = os.path.join(save_dir,''+'from'+'_'+file+'.csv')
        print(file_path,save_path)
        txt2csv_file(file_path,save_path)
#3
东海ECS2023-03-22 19:03
代码中最后一行函数调用被注释掉了,需要将注释去掉才能运行函数将txt文件转换为csv文件并保存在指定的文件夹中。此外,代码中也没有出现任何关于输出“!debugfile('D:/spyderlianxi/data_from_test_txt/txt csv1.py', wdir='D:/spyderlianxi/data_from_test_txt')”这段信息的代码,因此需要进一步检查是否存在其他脚本或工具对代码的运行产生了影响。
#4
哈一耶2023-03-23 09:26
简化以后最后一行是错误的;即提示“txt2csv_file(file_path,save_path)”

还有,“#txt_data_to_csv(path,save_dir)”将最后一行注释去掉,保存为CSV文件时,软件得出以下错误信息:
!debugfile('D:/spyderlianxi/data_from_test_txt/txt csv1.py', wdir='D:/spyderlianxi/data_from_test_txt')
Traceback (most recent call last):

  File "d:\spyderlianxi\data_from_test_txt\txt csv1.py", line 51, in <module>
    txt_data_to_csv(path,save_dir)

  File "d:\spyderlianxi\data_from_test_txt\txt csv1.py", line 41, in txt_data_to_csv
    y_list.append(xy[1]) #提取txt文件每行的第二个元素

IndexError: list index out of range
#5
哈一耶2023-03-23 11:17
重新写了一下

import os
import csv

def txt_data_to_csv(path,save_dir):
     files= os.listdir(path)              #遍历文件夹中的所有文件,将文件名存储在列表中
     for file in files:                   #遍历文件夹中的txt文件
        file_path = os.path.join(path,file)
        save_path=os.path.join(save_dir,file+'.csv')
        x_list=[]                        #新建空列表用于存储数据
        with open(file_path,'r') as f:   #打开txt文件
              for line in f:               #遍历存储了文件信息的列表
                line=line.split()
                with open(save_path, "w") as f:
                   writer = csv.writer(f)   
                   writer.writerow(x_list)
            
path=r'D:\spyderlianxi\data_from_test_txt'        #txt文件所在文件夹路径
save_dir=r'D:\spyderlianxi\data_from_test_txt'    #csv文件存储所在文件夹
txt_data_to_csv(path,save_dir)  
输出的是空表,哪里错了呢?
#6
wp2319572023-03-23 13:00
回复 5楼 哈一耶
搞不清还要那么复杂吗

程序代码:

import re

with open("temp.txt",'r',encoding="gb2312") as f:   
    lines=f.readlines()   
    b=[]      
    for line in lines:           
        line = line.strip()      
        xy=re.sub(" +",",",line) +"\n"  
        b.append(xy)
   
    with open("temp2.csv", "w", encoding="utf-8" ,newline='') as f2:
        f2.writelines(b)


#7
哈一耶2023-03-23 14:54
回复 6楼 wp231957
运行了一下,只能转一个文件,不能批量转换;转换的文件没有分列,全部都在一列里。
#8
wp2319572023-03-23 15:10
回复 7楼 哈一耶
方便的话  把你的txt  以及最终结果  想要什么样的csv  都发出来  (我印象中 csv  不就是逗号分割吗 )

另:  只有单个文件转成功了,才能做批量转   不过就是套了一层路径而已   都是小事了
#9
wp2319572023-03-23 15:14
回复 7楼 哈一耶
其实,我觉得带空格分割的原始文件  比较容易处理一些,根本就不需要转来转去的  
#10
哈一耶2023-03-23 15:29
110043 无锡转债 日线 前复权
      日期        开盘        最高        最低        收盘        成交量        成交额
2018/03/14    99.880    99.880    97.400    97.430    843286    827886016.00
2018/03/15    97.510    97.550    96.710    96.890    274942    266733264.00
2018/03/16    96.930    97.140    96.930    96.990    113902    110530520.00
2018/03/19    96.950    96.980    96.590    96.800    112843    109147776.00
2018/03/20    96.620    96.700    96.420    96.530    109005    105255264.00
-----------------------------------------------------------------
   日期        开盘     最高     最低     收盘    成交量      成交额
2018/03/14    99.880    99.880    97.400    97.430    843286    827886016.00
2018/03/15    97.510    97.550    96.710    96.890    274942    266733264.00
2018/03/16    96.930    97.140    96.930    96.990    113902    110530520.00
2018/03/19    96.950    96.980    96.590    96.800    112843    109147776.00
2018/03/20    96.620    96.700    96.420    96.530    109005    105255264.00


上面是TXT文件,有很多个;下面是CSV格式,我是想在文件夹里生成与TXT同文件名的CSV文件,谢谢。
#11
哈一耶2023-03-23 15:34
import csv
csvFile = open("./data.csv",'w',newline='')
writer = csv.writer(csvFile)
csvRow = []

f = open("data.txt",'r')
for line in f:
    csvRow = line.split()
    writer.writerow(csvRow)
   
f.close()
csvFile.close()

运行这个可以生成CSV,但是不能批量生成,只是1个。
#12
wp2319572023-03-23 15:38
回复 10楼 哈一耶
我咋没看出来上下有啥区别呢,不都是空格分割
#13
哈一耶2023-03-23 15:44
只有本站会员才能查看附件,请 登录

这个是转出后的图片 .csv文件
#14
哈一耶2023-03-23 15:46
只有本站会员才能查看附件,请 登录

这个是txt文件
#15
哈一耶2023-03-23 15:48
生成的文件如何去掉第一行,只从表头开始。就是去掉“110043    无锡转债    日线    前复权”这一行。
#16
wp2319572023-03-23 15:58
回复 15楼 哈一耶
我还以为你特意要这一行呢
#17
哈一耶2023-03-23 15:59
我是想要批量将TXT文件转成同文件名CVS文件,方便调用计算,同时希望去掉第一行。
#18
wp2319572023-03-23 16:02
回复 11楼 哈一耶
程序代码:

import csv,os

path="d:\\test"
files=os.listdir(path)
for txtfile in files:
    csvFile = open(path+"\\"+txtfile.split(".")[0]+".csv",'w',newline='')
    writer = csv.writer(csvFile)
    csvRow = []
    f = open(path+"\\"+txtfile,'r',encoding="gb2312")
    for line in list(f)[1:]:
        csvRow = line.split()
        writer.writerow(csvRow)
   
    f.close()
    csvFile.close()




只有本站会员才能查看附件,请 登录
#19
wp2319572023-03-23 16:05
回复 11楼 哈一耶
编码格式你可以酌情调整
#20
wp2319572023-03-23 16:11
回复 11楼 哈一耶
不用csv模块 也可以的,把txt 中的空格替换为 半角逗号   然后扩展名为csv 然后用excel打开 就自然分字段了
#21
哈一耶2023-03-23 16:13
已经解决了,非常感谢!!!
#22
哈一耶2023-03-23 16:30
“空格替换为半角逗号”是转换模块吗?如果我想转换成excel文件,我刚才试了一下,把CSV全部改成XLSX,显示没有XLSX模块。
#23
哈一耶2023-03-23 16:33
import xlsx,os

path="d:\\test"
files=os.listdir(path)
for txtfile in files:
    xlsxFile = open(path+"\\"+txtfile.split(".")[0]+".csv",'w',newline='')
    writer = xlsx.writer(xlsxFile)
    xlsxRow = []
    f = open(path+"\\"+txtfile,'r',encoding="gb2312")
    for line in list(f)[1:]:
        xlsxRow = line.split()
        writer.writerow(xlsxRow)
   
    f.close()
    xlsxFile.close()

显示这个错误提示:ModuleNotFoundError: No module named 'xlsx'
#24
wp2319572023-03-23 16:37
回复 23楼 哈一耶
当然不能这样写,明天吧,现在没在电脑前
#25
哈一耶2023-03-23 17:05
谢谢!
#26
sheeboard2023-03-23 20:20
用pandas的pd.read_csv更简单,和glob.glob一起用就可以批量转了。

[此贴子已经被作者于2023-3-23 20:23编辑过]

1