将使用zip创建的元组打印到文本文件中



第一次使用python是在今天,所以请原谅我有点垃圾。这是基本代码,我知道它是有效的。

from lxml import html
import lxml
import requests
sourcepage = requests.get('http://www.bbc.co.uk/sport/football/championship/table')
tree = html.fromstring(sourcepage.content)
teamname = tree.xpath('descendant::table[1][@class = "table-stats"]/tbody/tr/td[@class = "team-name"]/a/text()')
position = tree.xpath('descendant::table[1][@class = "table-stats"]/tbody/tr/td[@class = "position"]/span[@class = "position-number"]/text()')
movement = tree.xpath('descendant::table[1][@class = "table-stats"]/tbody/tr/td[@class = "position"]/span[@class="moving-down" or @class="no-movement" or @class="moving-up"]/text()')
goaldiff = tree.xpath('descendant::table[1][@class = "table-stats"]/tbody/tr/td[@class = "goal-difference"]/text()')
points  =  tree.xpath('descendant::table[1][@class = "table-stats"]/tbody/tr/td[@class = "points"]/text()')
combined = zip(teamname,position,movement,goaldiff,points)

它所做的是抓取一个网站,保存为一棵树,并将其变成一个元组(我认为(

使用将表格精细打印到命令行

print("Pos. | Team | P | GD | Ptsn:--:|:--|:--:|:--:|:--:")
for var1,var2,var3,var4,var5 in combined:
    print(var1,"|",var2,var3,"|",var4,"|",var5)

但我在将其打印到文件中时遇到了严重问题。

我尝试了以下方法:

outfile = open('output.txt', 'w')
print>>outfile("Pos. | Team | P | GD | Ptsn:--:|:--|:--:|:--:|:--:")
for var1,var2,var3,var4,var5 in combined:
    print>>outfile(var1,"|",var2,var3,"|",var4,"|",var5)
outfile.close()

此输出一个错误-TypeError:"_io.TextIOWrapper"对象不可调用

with open('output.txt', 'w') as fp:
    fp.write("Pos. | Team | P | GD | Ptsn:--:|:--|:--:|:--:|:--:n")
    for var1,var2,var3,var4,var5 in combined:
        var1s = str(var1)
        print("debug: var1 / var1s set to: ",var1,var1s) #prints nothing (?)
        var2s = str(var2)
        var3s = str(var3)
        var4s = str(var4)
        var5s = str(var5)
        fp.write(var1s+"|"+var2s+var3s+"|"+var4s+"|"+var5s+"n")

这只输出标题行。

(var1a, var2a, var3a, var4a, var5a) = combined
 var1a, var2a, var3a, var4a, var5a = combined
print(var1a)

两人都让我大吃一惊,因为他们都返回了一个ValueError:没有足够的值来解包(预期为5,实际为0(

with open('output.txt', 'w') as fp:
    fp.write('n'.join('{} {} {} {} {}' % x for x in combined))

这会输出一个空白文件,也是如此

outfile = open('outfile.txt', 'w')
for t in combined:
    line = ' '.join(str(x) for x in t)
    outfile.write(line + 'n')
outfile.close()

with open('output.txt', 'w') as f:
    for stuff in combined:
        f.write('%s %s %s %s %sn' % stuff)

我花了几个小时在谷歌上搜索,试图找出堆叠式问题的答案,但我还是做得不够,我有点力不从心。

我想将其输出到文件中的原因是,之后的下一步是在输出中运行一些regex,将使用的截断名称转换回它们的正确名称,并在其周围包装一些reddit标记,将它们转换为链接。

在将combined zip打印到控制台之后,您似乎试图写入文件。在Python3中,zip生成一个生成器,也就是说,迭代一次就会耗尽它。

>>> z = zip([1,2,3],[4,5,6])
>>> list(z)
[(1, 4), (2, 5), (3, 6)]
>>> list(z)
[]

首先将生成器转换为列表,即combined = list(zip(...)),或者如果不需要,只删除打印到控制台的部分。

一旦修复了这个问题,任何将值写入文件的方法都应该有效——除了第一种方法。Python 2中的print >> outfile(params)语法在Python 3中是非法的。它试图用params调用outfile(因此不可调用异常(,然后将>>print函数右移该量。。。不管那是什么意思。相反,您需要print(params, file=outfile),或者只使用任何其他方法。

import sys
sys.stdout=open("test.txt","w")
print("Pos. | Team | P | GD | Ptsn:--:|:--|:--:|:--:|:--:")
for var1,var2,var3,var4,var5 in combined:
    print(var1,"|",var2,var3,"|",var4,"|",var5)
sys.stdout.close()

看起来有效,但有点作弊。

最新更新