如何使用请求从 url 转换包含 pandas 数据框中的行(字符串)的列表

How do I convert a list containing lines(in string) in a pandas data frame from an url using requests

我正在尝试从初始 uniprot url:

获取最终的 pandas 数据帧
import requests
url = 'http://www.uniprot.org/uniprot/?query=Interferon+lambda+receptor+1&sort=score&format=tab'
req = requests.get(url)

输出:

req.text 

是这样的:

""Entry\tEntry name\tStatus\tProtein names\tGene names\tOrganism\tLength\nQ8IU57\tINLR1_HUMAN\treviewed\tInterferon lambda receptor 1 (IFN-lambda receptor 1) (IFN-lambda-R1) (Cytokine receptor class-II member 12) (Cytokine receptor family 2 member 12) (CRF2-12) (Interleukin-28 receptor subunit alpha) (IL-28 receptor subunit alpha) (IL-28R-alpha) (IL-28RA) (Likely interleukin or cytokine receptor 2).....

得到我做的台词:

lines = req.text.splitlines()

#每一行都用逗号分隔 ' ', ' ', ... #列由'\t'

分隔

如果我使用:

import re
re.split(r'\t+', lines[0])

这样可以正确拆分每列。

Out:
['Entry',
 'Entry name',
 'Status',
 'Protein names',
 'Gene names',
 'Organism',
 'Length']

但是,如果我想做一个 for 循环并在所有行上执行它,我会得到一个错误:string2list(lines): list indices must be integers or slice, not str'

import re

def string2list(file):
    list = []
    for i in lines:
        re.split(r'\t+', lines[i])
        list += lines
        return list

我的目标是得到一个列表列表最终使用这个代码:

import pandas as pd
list_name = lines
df = pd.DataFrame (list_name, columns = lines[i])

关于什么是最佳方法有什么想法吗?是否可以将列表中的字符串转换为列表列表?什么是最好的方法?还是有另一种方法可以直接从 url 到达 pandas 数据框? 提前致谢!

将该文件加载到 DataFrame 中的最简单方法是使用 pd.read_csv(),它支持 url 输入。

import pandas as pd
url = 'http://www.uniprot.org/uniprot/?query=Interferon+lambda+receptor+1&sort=score&format=tab'
df = pd.read_csv(url, sep='\t')

顺便说一句,关于您的代码:

def string2list(file):
    list = []
    for i in lines:
        re.split(r'\t+', lines[i])
        list += lines
        return list

有几个问题。

  • file 未使用
  • lines 未定义
  • i 是字符串,不是整数。
  • 因此,您的意思可能是 re.split(r'\t+', i)
  • list += lines 可能不是你的意思...
  • 您的 return 语句在 for 循环内,而不是在外部范围内。

IIUC,我想你的目标是写这样的东西:

def split_lines(file):
    with open(file, 'r') as f:
        lines = f.readlines()

    results = []
    for line in lines:
        words = re.split(r'\t', line.strip())
        results.append(words)
    return results

非常感谢 Stuart 的 `pd.read_csv()' 功能。它以一种非常有效的方式完全满足了我的需求!

另外一个for循环,非常感谢指正!

这也有效,感谢您对 for 循环的投入:

def split_lines2(url):
    req = requests.get(url) 
    lines = req.text.splitlines()

    results = []
    for line in lines:
        words = re.split(r'\t', line.strip())
        results.append(words)
    return results

test_x = split_lines2(my_url) #this give a list of lists
df = pd.DataFrame (data = test_x, columns = test_x[0])
df_drop_row_1 = df.drop(df.index[0])

再次感谢:)