Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python分离频率,并写入值的次数(789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578_Python_Text Files_Frequency - Fatal编程技术网

使用Python分离频率,并写入值的次数(789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578

使用Python分离频率,并写入值的次数(789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578,python,text-files,frequency,Python,Text Files,Frequency,我是一个基本的Python用户,我有一个大的文本数据文件(OUT2.txt),其中有许多值写为2*150,表示有两个150值(150 150)或4*7895表示四个7895值(7895 7895 7895 7895)。我想将所有这些类型的值都转换为彼此相邻的值,即7895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578

我是一个基本的Python用户,我有一个大的文本数据文件(OUT2.txt),其中有许多值写为
2*150
,表示有两个150值(150 150)或
4*7895
表示四个7895值(7895 7895 7895 7895)。我想将所有这些类型的值都转换为彼此相邻的值,即78957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578957895789578

已尝试此代码,但出现以下错误:

**parts = fl.split()
AttributeError: 'list' object has no attribute 'split'**

fl = open('OUT2.txt', 'r').readlines()
parts = fl.split()
lst = []
for part in parts:
    _parts = part.split('*')
    if len(_parts) == 1:
        lst.append(_parts[0])
    else:
        times = int(_parts[0])
        for i in range(times):
            lst.append(_parts[1])
open('OUT.3.txt','w+').writelines(lst)
有什么建议吗。谢谢

来自此文本数据文件示例

2*8.17997 723.188 4*33.33 3*11.0524 380.811 149.985 5*13.9643 22.8987 76.2205 2*24.7059 64.821 
进入这个

8.17997 8.17997 723.188 33.33 33.33 33.3 3 33.33 11.0524 11.0524 11.0524 and so on...
下面的方法应该有效

with open('in.txt') as f:
    out_lines = []
    lines = [l.strip() for l in f.readlines()]
    for l in lines:
        parts = l.split()
        lst = []
        for part in parts:
            _parts = part.split('*')
            if len(_parts) == 1:
                lst.append(_parts[0])
            else:
                times = int(_parts[0])
                for i in range(times):
                    lst.append(_parts[1])
        out_lines.append(' '.join(lst))
with open('out.txt', 'w') as f1:
    for line in out_lines:
        f1.write(line + '\n')
in.txt

2*8.17997 723.188 4*33.33 3*11.0524 380.811 149.985 5*13.9643 22.8987 76.2205 2*24.7059 64.821
10*8.17997 723.188 4*33.33 3*11.0524 380.811 149.985 5*13.9643 22.8987 76.2205 2*24.7059 64.821
out.txt

8.17997 8.17997 723.188 33.33 33.33 33.33 33.33 11.0524 11.0524 11.0524 380.811 149.985 13.9643 13.9643 13.9643 13.9643 13.9643 22.8987 76.2205 24.7059 24.7059 64.821
8.17997 8.17997 8.17997 8.17997 8.17997 8.17997 8.17997 8.17997 8.17997 8.17997 723.188 33.33 33.33 33.33 33.33 11.0524 11.0524 11.0524 380.811 149.985 13.9643 13.9643 13.9643 13.9643 13.9643 22.8987 76.2205 24.7059 24.7059 64.821

拆分字符串,在
*
上拆分并转换回字符串

s = "2*8.17997 723.188 4*33.33 3*11.0524 380.811 149.985 5*13.9643 22.8987 76.2205 2*24.7059 64.821"

# split the string
l = s.split()

# split on "*"
l = [x.split('*') for x in l]

# multiply recurring values, keep the single ones
l = [x[0] if len(x) == 1 else " ".join([x[1]] * int(x[0])) for x in l]

# join back to a string
result = " ".join(l)
如果一个项目没有
*
,它只是作为字符串保存(
x[0]
,因为
split(“*”
将返回一个元素列表)。如果它这样做,
split(“*”)
将返回2个值,第一个
x[0]
需要解析为int,并且
[x[1]]*i
是在空白处连接的重复项的列表:

>>> ["11.883"] * 4
["11.883", "11.883", "11.883", "11.883"]
>>> " ".join(["11.883"] * 4)
>>> "11.883 11.883 11.883 11.883"
尝试使用正则表达式:

重新导入
#例如,这是您在读取文件后将获得的内容
text=“2*8.17997 723.188 4*33.33 3*11.0524”
matches=re.findall(r'(\d+\*)?(\d+\.\d+),text)
#匹配项=[('2*','8.17997'),('723.188'),('4*','33.33'),('3*','11.0524')]
输出=[]
对于匹配中的匹配:
如果匹配[0]:
times=int(匹配[0][:-1])#删除`*`
其他:
times=1#no`x*y`表示一次y
对于范围内的(次):
output.append(匹配[1])
output_str=''.join(输出)
#输出_str='8.17997 8.17997 723.188 33.33 33.33 11.0524 11.0524 11.0524'

这个代码不是很好,只是为了让你理解这个想法。这里有趣的部分是正则表达式。您可以在此处看到更多详细信息:

目前为止看起来不错。然后检查每个单词是否有“乘法运算”,并直接或在处理乘法运算后将其添加到列表中。@MichaelButscher谢谢你的回答,我尝试过这样做,但似乎无法获得,请提供任何代码建议?谢谢链接到5小时前提出的完全相同的问题:感谢您的回答和建议,如果我希望代码从一个文本文件(可能是f=open('out.txt')中获取数据,而不是插入值(data=),然后在进行更改(out2.txt)后将其写入另一个文本文件,则会发生什么变化。谢谢@我想你可以从这里开始。看看如何用python读/写文本文件。我有一个AttributeError。我更新了我的问题。感谢
fl
是一个行(字符串)列表。您需要在这些行上循环。感谢您的回答和建议,如果我希望代码从一个文本文件(可能是f=open('OUT2.txt')中获取数据,而不是以(text=)的形式插入值,然后在进行更改(OUT3.txt)后将其写入另一个文本文件,那么会发生什么变化。谢谢