【问题标题】:Import data from a text file into a pandas dataframe将文本文件中的数据导入 pandas 数据框
【发布时间】:2019-09-01 11:23:00
【问题描述】:

我正在使用 Django 构建一个网络应用程序。我使用

上传了一个文本文件

csv_file = request.FILES['file'].

我无法将 csv 读入 pandas。我试图导入的文件有文本和数据,但我只想要数据。

我尝试了以下方法

  1. df = pd.read_csv(csv_file, sep=" ", header=None, names=["col1","col2","col3"], skiprows = 2) 尝试删除 cmets 并读取数字

错误:pandas 不会读取所有 3 列。它只读取 1 列

  1. 我试过 df = pd.read_csv(csv_file, sep="\s{2}", sep=" ", header=None, names=["col1","col2","col3"], skiprows = 2) 尝试移除 cmets 并读取数字

错误:不能在类似字节的对象上使用字符串模式

  1. 我尝试 df = pd.read_csv(csv_file.read(), sep=" ", header=None, names=["col1","col2","col3"], skiprows = 2) 尝试删除cmets,只需阅读数字

我上传的文件

% filename
% username
2.0000  117.441  -0.430
2.0100  117.499  -0.337
2.0200  117.557  -0.246
2.0300  117.615  -0.157
2.0400  117.672  -0.069

views.py

def new_measurement(request, pk):
    material = Material.objects.get(pk=pk)
    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save(commit=False)
            topic.material = material
            topic.message=form.cleaned_data.get('message')
            csv_file = request.FILES['file']
            df = genDataFrame(csv_file)
            topic.data = df
            topic.created_by = request.user
            topic.save()
            return redirect('topic_detail', pk =  material.pk)
    else:
        form = NewTopicForm()
    return render(request, 'new_topic.html', {'material': material, 'form': form})
def genDataFrame(csv_file):
    df = pd.read_csv(csv_file, sep=" ", header=None, names=["col1","col2","col3"])
    df = df.convert_objects(convert_numeric=True)
    df = df.dropna()
    df = df.reset_index(drop = True)
    return df_list

我想得到一个像

这样的数据框
col1   col2     col3
2.0000  117.441  -0.430
2.0100  117.499  -0.337
2.0200  117.557  -0.246
2.0300  117.615  -0.157
2.0400  117.672  -0.069

【问题讨论】:

    标签: python django pandas


    【解决方案1】:

    这适用于您提供的数据,并为您提供您期望的数据框:

    df = pd.read_csv(csv_filepath, sep='  ', header=None, 
                     names=['col1', 'col2', 'col3'], skiprows=2, engine='python')
    

    因为sep不止一个字符,所以需要使用python引擎而不是C引擎。 python 引擎有时会遇到引号问题,但你没有,所以没关系。您实际上甚至不需要指定 python 引擎,它会自动为您选择,但您会收到 stderr 的警告;指定引擎会抑制这种情况。

    【讨论】:

    • 当我有 sep = ' ' 时,我收到一个错误“不能在类似字节的对象上使用字符串模式”。当我有 sep = '\s+' 时,警告是“字符串中的异常反斜杠:'\s'。字符串常量可能缺少 r 前缀”,它给了我一个空的 DataFrame
    • 在正则表达式中使用反斜杠时,需要使用原始文本,即 sep=r'\s+'
    • 至于您的类似字节测试的对象,听起来您还没有将文件解码为文本格式。
    • 您能告诉我如何将我的文件解码为文本格式吗?当我键入 csv_filepath.read() 时,类类型是“字节”。
    【解决方案2】:

    您在描述点#2 中的方法几乎是正确的。另外,我的答案只是将正则表达式作为分隔符添加到@prooffreader 的答案中,因为它会使语句不易出错。

     df = pd.read_csv('file_path', sep="\s+",header=None, 
                        names=['col1', 'col2','col3'], skiprows=2)
    

    【讨论】:

    • 当我有 sep = ' ' 时,我收到一个错误“不能在类似字节的对象上使用字符串模式”。当我有 sep = '\s+' 时,警告是“字符串中的异常反斜杠:'\s'。字符串常量可能缺少 r 前缀”,它给了我一个空的 DataFrame
    • 尝试使用分隔符 = r'\s+'。如果这不起作用,您能否发布您用于读取文件和文件的完整代码?理想情况下,您不应该收到这样的错误。
    • 谢谢!有效。我不得不重新导入。那是错误
    猜你喜欢
    • 2012-12-11
    • 2019-10-13
    • 2021-12-22
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多