【问题标题】:Create .csv file table Python创建 .csv 文件表 Python
【发布时间】:2018-07-16 01:36:54
【问题描述】:

我正在尝试创建一个 .csv 文件表。我正在努力将数据组织成表格格式。如何在正确的标题位置下组织输出数据?

import urllib
import urllib.request
from bs4 import BeautifulSoup
import os
from string import ascii_uppercase

def make_soup(url):
    thepage = urllib.request.urlopen(url)
    soupdata = BeautifulSoup(thepage, "html.parser")
    return soupdata

stockdatasaved=""
soup = make_soup("https://finviz.com/quote.ashx?t=mbot")
for record in soup.findAll('td', {"class":"snapshot-td2"}):
        stockdata=""
        stockdata=stockdata+','+record.text
        stockdatasaved = stockdatasaved +"\n" +stockdata[1:]

header="Index,MarketCap,Income,Sales,Bk/sh,$/sh,Div,Div%,Empl,Optionable,Shortable,Recom,P/e,Forward P/e,PEG," \
       "P/s,P/b,P/c,P/fcf,QuickRatio,CurrentRatio,Debt/Eq,LT Debt/Eq,SMA20,Eps,Eps next Y,Eps next Q,Eps this Y," \
       "Eps next 5Y,Eps past 5Y,Sales past 5Y,Sales Q/Q, Earnings, Sma50,Insider Own,Insider Trans,Inst Own," \
       "Inst trans,ROA,ROE,ROI,Gross Margin,Oper. Margin,Profit Marg,Payout,SMA200,Shs Outstand,Shs Float," \
       "Short Float,Short Ratio,Target Price,52W Range,52W High,52W Low,RSI(14),Rel Volume,Avg Volume,Volume," \
       "Perf Week,Perf Month,Perf Q,Perf Half Y,Perf Y,Perf YTD,Beta,ATR,Volatility,Prev Close,Price,Change"+"\n"
file = open(os.path.expanduser("Stocks.csv"),"wb")
file.write(bytes(header, encoding="ascii",errors='ignore'))
file.write(bytes(stockdatasaved,encoding="ascii",errors='ignore'))

what my csv file looks like

【问题讨论】:

    标签: python csv datatable beautifulsoup


    【解决方案1】:

    是的,您绝对应该使用csv 模块,它将简化您的代码。在这种情况下,看起来 csv 文件中应该只有两行 - 标题和数据行。

    import csv
    import urllib.request
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(
        urllib.request.urlopen('https://finviz.com/quote.ashx?t=mbot'),
        'html.parser'
    )
    
    with open('output.csv', 'wt') as file:
        writer = csv.writer(file)
    
        # write header row
        writer.writerow(map(lambda e : e.text, soup.find_all('td', {'class':'snapshot-td2-cp'})))
    
        # write body row
        writer.writerow(map(lambda e : e.text, soup.find_all('td', {'class':'snapshot-td2'})))
    

    【讨论】:

    • 布赖恩,谢谢!当我使用您的示例代码时,我收到与 writer = csv.writer(csvfile) 行对应的错误,该错误显示为 File "C:/Users/Taylor .DESKTOP-0SBM378/PycharmProjects /helloworld/ScrapingTable.py",第 10 行,open('output.csv', 'wb') as csv.file ^ SyntaxError: invalid syntax
    • 根据错误,变量名称中似乎有句点。您可能想要使用不同的名称(例如,您可以使用file,而不是使用csvfile 作为变量名。我也更新了示例。
    • 这就是问题所在。但是,在 writer.writerow(map(lambda e : e.text, soup.findAll('td', {'class':'snapshot-td2-cp'}))) TypeError: a bytes-like object is required 中,不是 'str' 我该怎么做才能用 str 写一个 csv?
    • 所以,问题在于我使用wb 打开文件,而不是应有的wt(第10 行)。我已经修好了。这是一个示例:repl.it/repls/WhichHighMurrelet
    【解决方案2】:

    您可以使用 csv 模块。 这是一个简单的例子,

    import csv
    
    # create a csv file object and open
    with open('/path/sample.csv', 'wt') as csvfile:
        writer = csv.writer(csvfile, delimiter='\t', lineterminator='\n', )
        # Add the header row
        writer.writerow(['Odd', 'Even'])
        for i in range(1,20,2):
            # Add the data row
            writer.writerow([i, i+1])
    

    sample.csv 文件如下所示:

    +-----+-------+
    | Odd |  Even |
    +-----+-------+
    |   1 |     2 |
    |   3 |     4 |
    |   5 |     6 |
    |   7 |     8 |
    |   9 |    10 |
    |  11 |    12 |
    |  13 |    14 |
    |  15 |    16 |
    |  17 |    18 |
    |  19 |    20 |
    +-----+-------+
    

    【讨论】:

      【解决方案3】:

      您也可以使用 Pandas。

      例如:

      import pandas as pd
      def write_to_csv(self,output):
        df_output =  pd.DataFrame(output,columns=['Index','Name'],dtype=float)
              df_output.to_csv('output.csv')
      
      write_to_csv([['1','IBM'],['2','Cogni'],['3','Toyota'],['4','tomtom']])
      

      【讨论】:

        【解决方案4】:

        首先您可能想import csv,这应该会大大减少您在输出 csv 信息时遇到的问题。

        文档链接位于:https://docs.python.org/2/library/csv.html

        另外我想指出,您还没有真正解释 csv 表的结构或用途,所以我无法真正帮助您

        【讨论】:

          猜你喜欢
          • 2011-05-06
          • 2018-04-27
          • 2015-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-04
          • 2018-09-02
          • 2017-12-26
          相关资源
          最近更新 更多