Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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文件i/o_Python_Regex_File Io - Fatal编程技术网

Python文件i/o

Python文件i/o,python,regex,file-io,Python,Regex,File Io,我写了这段代码,应该解析输入文件中的行 输入格式: 电影ID可以有多个条目,因此我们应该计算平均值 输出: **没有重复(这就是问题所在) 重新导入 f=打开(“ratings2.txt”、“rb”) fo=open(“ratings3.txt”、“wb”) 行=f.读行() 电影列表=[] 对于行中的行: m_obj=重新搜索(r“”,行) x=m_对象组(1) 评级列表=[] 如果x不在movielist中: movielist.append(x) 对于行中的子行: n_obj=重新搜索(r

我写了这段代码,应该解析输入文件中的行 输入格式: 电影ID可以有多个条目,因此我们应该计算平均值 输出: **没有重复(这就是问题所在)

重新导入
f=打开(“ratings2.txt”、“rb”)
fo=open(“ratings3.txt”、“wb”)
行=f.读行()
电影列表=[]
对于行中的行:
m_obj=重新搜索(r“”,行)
x=m_对象组(1)
评级列表=[]
如果x不在movielist中:
movielist.append(x)
对于行中的子行:
n_obj=重新搜索(r“”,子行)
如果n_对象组(1)=x:
ratinglist.append(浮动(n_对象组(2)))
av=(浮动(总和(比率表))/浮动(长度(比率表)))
final=“\n”%(n_对象组(1),av)
fo.编写(最终版)
f、 关闭()
fo.close()
输入文件:

<122, 5>
<185, 5>
<122,4.5>

期望输出:

<122, 4.75>
<185, 5>

但这里的问题似乎是代码对每个实例进行双循环,并添加一行实例的第一个条目……有人能帮忙吗

实际产量:

<122, 5>
<122, 4.75>
<185, 5>

第一行和第二行的“如果x不在movielist中”将为真。 对于第一行,当您读取第二个循环中的所有行时,第一行和第三行的“if n_obj.group(1)==x”(if 122==122)将为真。因此,“fo.write(final)”行将执行两次。在整个程序运行过程中,“fo.write(final)”将执行三次,因此您将得到三行输出

至少这解释了为什么你得到的是三行而不是预期的两行。

第一行和第二行的“如果x不在movielist中”是正确的。 对于第一行,当您读取第二个循环中的所有行时,第一行和第三行的“if n_obj.group(1)==x”(if 122==122)将为真。因此,“fo.write(final)”行将执行两次。在整个程序运行过程中,“fo.write(final)”将执行三次,因此您将得到三行输出


至少这解释了为什么您得到的是三行而不是预期的两行。

您的代码是缩进的,这样“if n_obj.group(1)==x:”和对“fo”的相关写入会针对行中的每一行执行,这样在输出文件中会有一条与每个输入记录对应的记录,而不是它应该执行的操作

应更改“if”块,以便“平均值写入循环外部”,但检查电影id仍在循环内部。目前,您正在为行中的每个子行编写平均值


只需相应地更改代码和缩进即可

对代码进行缩进,以便对行中的每一行执行“if n_obj.group(1)==x:”和相关的对“fo”的写入,从而在输出文件中有一条与每个输入记录对应的记录,这不是它应该做的

应更改“if”块,以便“平均值写入循环外部”,但检查电影id仍在循环内部。目前,您正在为行中的每个子行编写平均值


只需相应地更改代码和缩进即可

以下代码将执行您想要的操作:

import re
a = {}
with open('input.txt', 'rb') as f:
    for line in f:
        x = re.search(r'<([^,]+),\s?([^>]+)>', line)
        x,y = float(x.group(1)), float(x.group(2))
        if x in a:
            a[x].append(y)
        else:
            a[x] = [y]

for key in a:
    a[key] = sum(a[key])/len(a[key])

print a

with open('output.txt', 'wb') as f:
    for i,j in a.items():
        f.write('<'+str(i)+', '+str(j)+'>\n')

[input.txt]
<122, 5>
<185, 5>
<122,4.5>

[output.txt]
<122, 4.75>
<185, 5>
重新导入
a={}
将open('input.txt','rb')作为f:
对于f中的行:
x=重新搜索(r']+)>,第行)
x、 y=浮动(x组(1)),浮动(x组(2))
如果a中有x:
a[x]。追加(y)
其他:
a[x]=[y]
对于a中的键:
a[键]=和(a[键])/len(a[键])
打印
以open('output.txt','wb')作为f:
对于a.items()中的i,j:
f、 写入('\n')
[input.txt]
[output.txt]

以下代码将执行您想要的操作:

import re
a = {}
with open('input.txt', 'rb') as f:
    for line in f:
        x = re.search(r'<([^,]+),\s?([^>]+)>', line)
        x,y = float(x.group(1)), float(x.group(2))
        if x in a:
            a[x].append(y)
        else:
            a[x] = [y]

for key in a:
    a[key] = sum(a[key])/len(a[key])

print a

with open('output.txt', 'wb') as f:
    for i,j in a.items():
        f.write('<'+str(i)+', '+str(j)+'>\n')

[input.txt]
<122, 5>
<185, 5>
<122,4.5>

[output.txt]
<122, 4.75>
<185, 5>
重新导入
a={}
将open('input.txt','rb')作为f:
对于f中的行:
x=重新搜索(r']+)>,第行)
x、 y=浮动(x组(1)),浮动(x组(2))
如果a中有x:
a[x]。追加(y)
其他:
a[x]=[y]
对于a中的键:
a[键]=和(a[键])/len(a[键])
打印
以open('output.txt','wb')作为f:
对于a.items()中的i,j:
f、 写入('\n')
[input.txt]
[output.txt]
感谢马克·卢顿 我用以下条件编辑了“子行”循环

for subline in lines:
        n_obj = re.search(r"<(\S+), (\S+)>", subline)
        if subline == ln:
            ratinglist.append(float(n_obj.group(2)))
        elif n_obj.group(1)==x:
            ratinglist.append(float(n_obj.group(2)))
            av= (float(sum(ratinglist))/float(len(ratinglist)))
            final= "<%s, %.2f>\n" %(n_obj.group(1), av)                
            fo.write(final)
对于行中的子行:
n_obj=重新搜索(r“”,子行)
如果子行==ln:
ratinglist.append(浮动(n_对象组(2)))
elif n_对象组(1)==x:
ratinglist.append(浮动(n_对象组(2)))
av=(浮动(总和(比率表))/浮动(长度(比率表)))
final=“\n”%(n_对象组(1),av)
fo.编写(最终版)
感谢马克·卢顿 我用以下条件编辑了“子行”循环

for subline in lines:
        n_obj = re.search(r"<(\S+), (\S+)>", subline)
        if subline == ln:
            ratinglist.append(float(n_obj.group(2)))
        elif n_obj.group(1)==x:
            ratinglist.append(float(n_obj.group(2)))
            av= (float(sum(ratinglist))/float(len(ratinglist)))
            final= "<%s, %.2f>\n" %(n_obj.group(1), av)                
            fo.write(final)
对于行中的子行:
n_obj=重新搜索(r“”,子行)
如果子行==ln:
ratinglist.append(浮动(n_对象组(2)))
elif n_对象组(1)==x:
ratinglist.append(浮动(n_对象组(2)))
av=(浮动(总和(比率表))/浮动(长度(比率表)))
final=“\n”%(n_对象组(1),av)
fo.编写(最终版)

它应该做什么?它应该做什么?必须等待2天才能接受我自己的答案-他们说必须等待2天才能接受我自己的答案-他们说这里的问题是,当在空闲状态下运行时,剩余的代码就可以了,但当在终端上执行时,它返回以下错误“NoneType”对象没有属性“group”我知道这意味着什么,但为什么它首先在python IDLE中工作??这里的问题是,当在IDLE上运行时,它对剩余的代码来说是好的,但当在terminal上执行时,它返回以下错误“NoneType”对象没有属性“group”,我知道这意味着什么,但为什么它首先在python空闲中工作??