【问题标题】:Line breaks in code within print statement causing spaces in values printed to screen打印语句中的代码换行导致打印到屏幕的值中有空格
【发布时间】:2014-08-23 14:00:15
【问题描述】:

我有一些代码正在打印列表中的项目,每个项目之间没有空格,并且用逗号分隔它们:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Item
from scrapy.spider import BaseSpider
import re
import json

class ExampleSpider(CrawlSpider):
    name = "goal4"
    allowed_domains = ["whoscored.com"]
    start_urls = ["http://www.whoscored.com"]
    download_delay = 1

    rules = [Rule(SgmlLinkExtractor(allow=(''),deny=('/News', '/Fixtures', '/Graphics', '/Articles', '/Live', '/Matches', '/Explanations', '/Glossary', '/Players', 'ContactUs', 'TermsOfUse'),), follow=False, callback='parse_item')]

    def parse_item(self, response):

        sel = Selector(response)

        match1 = re.search(re.escape("DataStore.prime('stage-player-stat', defaultTeamPlayerStatsConfigParams.defaultParams , ") \
                     + '(\[.*\])' + re.escape(");"), response.body)

        if match1 is not None:
            playerdata1 = match1.group(1)

            for player in json.loads(playerdata1):

                print ("{TeamId},{PlayerId},{Name},{FirstName},{LastName},{TeamName},{PositionText},{PositionLong} \
            ,{Age} \
            ,{Height},{Weight},{GameStarted},{SubOn},{SubOff} \
            ,{Goals},{OwnGoals},{Assists},{Yellow},{SecondYellow},{Red} \
            ,{TotalShots} \
            ,{ShotsOnTarget},{ShotsBlocked},{TotalPasses},{AccuratePasses},{KeyPasses} \
            ,{TotalLongBalls},{AccurateLongBalls},{TotalThroughBalls},{AccurateThroughBalls} \
            ,{AerialWon},{AerialLost},{TotalTackles},{Interceptions},{Fouls} \
            ,{Offsides},{OffsidesWon},{TotalClearances},{WasDribbled},{Dribbles} \
            ,{WasFouled} \
            ,{Dispossesed},{Turnovers},{TotalCrosses},{AccurateCrosses}".decode().format(**player))

这适用于列表中的元素,直到第一个换行符。这是为了表示代码中的换行符,而不是屏幕上的任何中断。中断后直接打印的所有元素与前一个元素之间有巨大的空间。那些在休息之间的打印很好,直到下一个休息等。

我想知道的是,我怎样才能将这段代码分成多行而不影响打印的显示方式?

谢谢

【问题讨论】:

  • 除了 enrico.bacis 的回答,您可以简单地在代码中删除缩进。但是你会牺牲代码的可读性,这通常不是你想要的。 ;)

标签: python scrapy


【解决方案1】:

以pythonic方式创建一个很长的字符串,而不是这样:

s = 'this string is soooo\
     ooo loooong'

由于第二行的前导空格,打印为:

this string is soooo       ooo loooong

你可以使用:

s = ('this string is soooo'
     'ooo loooong')

打印如下:

this string is sooooooo long

在您的情况下,您应该:

print ('{TeamId},{PlayerId},{Name},{FirstName},{LastName},{TeamName},{PositionText},{PositionLong}'
       ',{Age}'
       ...
       ',{Dispossesed},{Turnovers},{TotalCrosses},{AccurateCrosses}').decode().format(**player)

【讨论】:

  • bacis 嗨,感谢您的回复。在上面的示例中,如果我删除换行符,python 将停止将我的语句识别为一个连续的字符串。
【解决方案2】:

使用""" 三重引号和replace

print ("""{TeamId},{PlayerId},{Name},{FirstName},{LastName},{TeamName},{PositionText},{PositionLong} 
                ,{Age} 
                ,{Height},{Weight},{GameStarted},{SubOn},{SubOff} 
                ,{Goals},{OwnGoals},{Assists},{Yellow},{SecondYellow},{Red} 
                ,{TotalShots} 
                ,{ShotsOnTarget},{ShotsBlocked},{TotalPasses},{AccuratePasses},{KeyPasses} 
                ,{TotalLongBalls},{AccurateLongBalls},{TotalThroughBalls},{AccurateThroughBalls} 
                ,{AerialWon},{AerialLost},{TotalTackles},{Interceptions},{Fouls} 
                ,{Offsides},{OffsidesWon},{TotalClearances},{WasDribbled},{Dribbles} 
                ,{WasFouled} 
                ,{Dispossesed},{Turnovers},{TotalCrosses},{AccurateCrosses}""".replace(" ","").decode().format(**player))

或者在你自己的代码中:

print ("{TeamId},{PlayerId},{Name},{FirstName},{LastName},{TeamName},{PositionText},{PositionLong} \
            ,{Age} \
            ,{Height},{Weight},{GameStarted},{SubOn},{SubOff} \
            ,{Goals},{OwnGoals},{Assists},{Yellow},{SecondYellow},{Red} \
            ,{TotalShots} \
            ,{ShotsOnTarget},{ShotsBlocked},{TotalPasses},{AccuratePasses},{KeyPasses} \
            ,{TotalLongBalls},{AccurateLongBalls},{TotalThroughBalls},{AccurateThroughBalls} \
            ,{AerialWon},{AerialLost},{TotalTackles},{Interceptions},{Fouls} \
            ,{Offsides},{OffsidesWon},{TotalClearances},{WasDribbled},{Dribbles} \
            ,{WasFouled} \
            ,{Dispossesed},{Turnovers},{TotalCrosses},{AccurateCrosses}".replace(" ","").decode().format(**player))

【讨论】:

    【解决方案3】:

    您也可以简单地将字符串分成几部分,然后用加号将它们连接起来。例如“你好”+“世界”

    【讨论】:

      猜你喜欢
      • 2016-08-16
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2017-03-08
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      相关资源
      最近更新 更多