相关文章推荐
胆小的茴香  ·  python 取文本左边 - CSDN文库·  3 小时前    · 
粗眉毛的蚂蚁  ·  python tkinter | ...·  3 小时前    · 
纯真的围巾  ·  python ...·  1小时前    · 
玩足球的手术刀  ·  [root@localhost tar]# ...·  3 月前    · 
悲伤的长颈鹿  ·  Springboot PostMapping ...·  1 年前    · 
体贴的打火机  ·  vue ...·  1 年前    · 
发怒的黄瓜  ·  Création compte Gmail ...·  1 年前    · 

用Python将txt中的逗号转换为点,同时包含科学数字格式化

5 人关注

我有一个文本文件(很大),所有数字之间用空格和制表符的组合来分隔,小数点和小数点之后用逗号分隔,而第一列是科学格式,接下来的是数字,但有逗号。我只是把第一行放在这里作为数字。

0,0000000E00 -2,7599284 -1,3676726 -1,7231264 -1,0558825 -1,8871096 -3,0763804 -3,2206187 -3,2308111 -2,3147060 -3,9572818 -4,0232415 -4,2180738

该文件太大,以至于记事本++无法处理它,无法将", "转换为""。

所以我所做的是:

with open(file) as fp:
    line = fp.readline()
    cnt = 1
    while line:
        digits=re.findall(r'([\d.:]+)', line)
        s=line
        s = s.replace('.','').replace(',','.')
        number = float(s)
        cnt += 1 

我甚至尝试使用数字,但这导致第一列被分成两个数字。

而最终我在使用.replace命令时得到的错误。我更希望的是将逗号转换为点,而不考虑科学等干扰性格式。我感谢你的帮助

ValueError: 无法将字符串转换为浮点数: ' 00000000E00
\t-29513521 \t-17002219 \t-22375536 \t-14994097
\t-24163610 \t-34076621 \t-31233623 \t-32341597
\t-24724552 \t-42434935 \t-43454237 \t-44885144

我还把how the input looks like in txt 以及我如何需要它的输出( csv格式 )

input seems like this :

first line :

第1列和第2列之间:3个空格+1个制表符

其余各列之间:6个空格+1个制表符

第二行和上。

第1列和第2列之间:2个空格+1个制表符

其余各列之间:6个空格+1个制表符

这是一个屏幕截图。txt input file : 请注意。每行开头有一个空格

和我想要的东西作为output is csv file用"; "分隔列

2 个评论
在Python中把整个文件读成一个字符串,然后把 , 全局替换成 . 会有问题吗?
如果这样做了,是的,无论如何它都会读取字符串中的所有数字,对吗? 请你写下代码好吗?
python
text
FabioSpaghetti
FabioSpaghetti
发布于 2019-12-18
3 个回答
Tim Biegeleisen
Tim Biegeleisen
发布于 2019-12-18
已采纳
0 人赞同

你可以尝试把整个文件读成一个Python字符串,然后把逗号改为点号,进行全局替换。

data = ""
with open('nums.csv', 'r') as file:
    data = file.read().replace(',', '.').replace(' ', ';')
with open("nums_out.csv", "w") as out_file:
    out_file.write(data)

对于一个可能更稳健的解决方案,如果存在两列可以通过以下方式分开的可能性multiple白边字符,使用re.sub

data = ""
with open('nums.csv', 'r') as file:
    data = file.read().replace(',', '.')
    data = re.sub(r'(?<=\n|^)[^\S\r\n]+', '', data)
    data = re.sub('(?<=\S)[^\S\r\n]+', ';', data)
    
非常感谢!我怎样才能在用open(filename+'.csv', "w")作为out_file写作时在csv中强加制表符分隔的(;)行。?
嗨,法比奥,只要再调用一次 replace() ,用分号代替空格即可。
新方案有一个问题:.replace(' ', ';')产生了许多空列
如果有缺失的数据,那就不是问题。 但如果你有多个空白字符,那么请查看我更新的答案。
你需要一个Python Excel库来做到这一点;Excel文件是二进制,而不是纯文本。
Swier
Swier
发布于 2019-12-18
0 人赞同

如果你在python中处理表格数据,你会想使用pandas包。这是一个很大的包,所以如果这只是一次性的,安装它的开销可能不值得。

熊猫有一个 read_csv函数 它可以很容易地处理这个问题,而且结果可以导出到csv。

import pandas as pd
dataframe = pd.read_csv("input.txt", sep="\s+", decimal=",")
dataframe.to_csv("output.csv", sep=";", header=False, index=False)

注意:如果你的原始文件没有头,也要把header=None传给read_csv函数。

ThomasW
ThomasW
发布于 2019-12-18
0 人赞同

问题是,你把整个字符串转换为浮点数,而python并不识别。它可以识别浮点数,甚至是科学符号,当你试图分别投掷它们的时候。

你可以做的是 split 使用 str.split() 的行。如果没有参数,split函数将在任何空白字符上进行分割,包括 '\t' 。然后你可以将每个字符转换为浮点数,并重建字符串。

with open(file) as fp:
    line = fp.readline()
    cnt = 1
    while line:
        digits=re.findall(r'([\d.:]+)', line)
        s=line
        s = s.replace('.','').replace(',','.')
        # Split the string into a list of strings
        s_list = s.split()
        # Convert each string to a float
        for i, num in enumerate(s_list):
            s_list[i] = float(num)