【问题标题】:List from CSV column in PythonPython中CSV列的列表
【发布时间】:2013-12-26 21:49:41
【问题描述】:

所以我为 Scrapy 编写了一个小片段,以便通过邮政编码在网站上搜索国家/地区,但是遍历所有不存在的邮政编码似乎是一种浪费,所以,首先,这就是我所拥有的......

def start_requests(self):
       for i in xrange(100000):
           yield self.make_requests_from_url("http://www.example.com/zipcode/%05d/search.php" % i)

这个想法很明显,但我下载了一个列中包含所有美国邮政编码的 CSV - 我如何轻松地将其用作在上述示例中使用的列表(或比列表更有效的方法)?如果这会让事情变得更容易,我有熊猫。

【问题讨论】:

    标签: python python-2.7 csv


    【解决方案1】:

    如果我对您的理解正确,您有一个以逗号分隔的文件,并且格式设置为在特定列(可能标题为“ZipCodes”)中每行都有一个邮政编码。

    如果有标题行和不同的列,并且您知道包含邮政编码的列的名称,您可以这样做:

    def start_requests(self, filename, columnname):
        with open(filename) as file:
            headers = file.readline().strip().split(',')
            for line in file.readlines():
                zipcode = line.strip().split(',')[headers.index(columnname)]
                yield self.make_requests_from_url("http://www.example.com/zipcode/%05d/search.php" % zipcode)
    

    【讨论】:

      【解决方案2】:

      打开文件、读取行、获取邮政编码、生成 ...

      for line in open('zipcodes.csv', 'r').readlines():
          zipcode = line.split(',')[columnNumberOfTheZipCodesStartingFrom0]
          yield self.make_requests_from_url("http://foo.com/blah/%s/search.php" % (zipcode,))
      

      【讨论】:

        【解决方案3】:

        只是为了完善一系列非常好的建议,这里是另一个。这种方法的主要思想是它不需要像 pandas 这样的特殊库,但也不仅仅是读取纯文件内容,在这种情况下,就 CSV 标记而言,您必须重新发明轮子(不是最难的)事情,但为什么要打扰?)。如果您的 csv 文件足够简单,则按照 dg99 的建议,读出文件内容可能会更容易

        使用python's built-in csv library!

        ziplist = []
        import csv
        with open('zipcodes.csv', 'rb') as csvfile:
            zipreader = csv.reader(csvfile)
            for row in zipreader:
                ziplist.append(row[i])
        

        注意事项:

        • 我有 row[i],其中 i 是 csv 文件中邮政编码的列索引。如果文件列出 zip+4 代码,您可以使用 row[i][:5]。有趣的是,如果您不知道邮政编码所在的列号,但您知道列标题(字段名称),则可以使用

          zipreader = csv.DictReader(csvfile)
          for zipDict in zipreader:
          ziplist.append(row['Zip Code Column Name Here'])

        • 根据this post,从列表中取回信息与元组一样有效,所以这似乎是要走的路。

        【讨论】:

          【解决方案4】:

          所以你想在一个 csv 中读取到一个列表......好吧: 我认为这应该很容易:

          import pandas
          colname = ['zip code','city']
          zipdata = pandas.read_csv('uszipcodes.csv', names=colname)
          

          希望我理解你的正确!

          【讨论】:

          • 如何获取这些数据并将其放入上面的yield 行?我需要将它放入 int 中。
          • pandas 是一个重量级的导入,仅用于阅读一列文本。 :)
          【解决方案5】:

          可能是这样的?

          #!/usr/local/cpython-3.3/bin/python
          
          import csv
          import pprint
          
          def gen_zipcodes(file_):
              reader = csv.reader(file_, delimiter='|', quotechar='"')
              for row in reader:
                  yield row[0]
          
          def main():
              with open('zipcodes_2006.txt', 'r') as file_:
                  zipcodes = list(gen_zipcodes(file_))
              pprint.pprint(zipcodes[:10])
          
          main()
          

          【讨论】:

            猜你喜欢
            • 2020-08-14
            • 1970-01-01
            • 1970-01-01
            • 2013-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-20
            • 1970-01-01
            相关资源
            最近更新 更多