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

时间:2016-11-07 03:56:01

标签: python python-3.x file-io tuples

今天第一次使用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 | Pts\n:--:|:--|:--:|:--:|:--:")
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 | Pts\n:--:|:--|:--:|:--:|:--:")
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 | Pts\n:--:|:--|:--:|:--:|:--:\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 %s\n' % stuff)

我花了几个小时谷歌搜索并试图通过stackoverflow问题挖掘我的方式,但我仍然做得很短,我在这里有点超出我的深度。

我想将它输出到文件的原因是在此之后的下一步是在输出上运行一些正则表达式,将截断的名称转换回正确的名称,并在其周围包裹一些reddit标记以转换它们进入链接。

2 个答案:

答案 0 :(得分:1)

您似乎尝试在之后写入文件,您已将combined zip打印到控制台。在Python 3中,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中是非法的。尝试做的是用outfile调用params(因此不可调用异常),然后右移{ {1}} >>函数的数量......无论那个意思是什么。相反,您需要print,或者只使用任何其他方法。

答案 1 :(得分:0)

import sys
sys.stdout=open("test.txt","w")

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

sys.stdout.close()

似乎工作,但它有点作弊。