当前位置: 首页 > 知识库问答 >
问题:

Python错误:打开csv时预期的str,bytes或os. Pathlike对象

潘俊
2023-03-14

我正在运行python 3代码:

import os
import csv
import glob
import numpy as np
import collections


Prices = collections.namedtuple('Prices', field_names=['time', 'open', 'high', 'low', 'close', 'volume'])


def read_csv(file_name, sep=',', filter_data=True, fix_open_price=False):
    print("Reading", file_name)                 
    with open(file_name, 'rt', encoding='utf-8') as fd:
        reader = csv.reader(fd, delimiter=sep)
        x = next(reader)                      
        if '<OPEN>' not in x and sep == ',':  
            return read_csv(file_name, ';') 
        indices = [x.index(s) for s in ('<TIME>', '<OPEN>', '<HIGH>', '<LOW>', '<CLOSE>', '<VOL>')]
        t, o, h, l, c, v = [], [], [], [], [], []
        count_out = 0
        count_filter = 0
        count_fixed = 0
        prev_vals = None
        for row in reader:
            vals = list(map(float, [row[idx] for idx in indices]))
            if filter_data and all(map(lambda v: abs(v-vals[0]) < 1e-8, vals[:-1])):
                count_filter += 1
                continue

            to, po, ph, pl, pc, pv = vals

            # fix open price for current bar to match close price for the previous bar
            if fix_open_price and prev_vals is not None:
                ppo, pph, ppl, ppc, ppv = prev_vals
                if abs(po - ppc) > 1e-8:
                    count_fixed += 1
                    po = ppc
                    pl = min(pl, po)
                    ph = max(ph, po)
            count_out += 1
            t.append(to)
            o.append(po)
            c.append(pc)
            h.append(ph)
            l.append(pl)
            v.append(pv)
            prev_vals = vals
    print("Read done, got %d rows, %d filtered, %d open prices adjusted" % (count_filter + count_out, count_filter, count_fixed))
    return Prices(time=np.array(t, dtype=np.int),
                  open=np.array(o, dtype=np.float32),
                  high=np.array(h, dtype=np.float32),
                  low=np.array(l, dtype=np.float32),
                  close=np.array(c, dtype=np.float32),
                  volume=np.array(v, dtype=np.float32))

def prices_to_relative(prices):
    """   
    Convert prices to relative in respect to open price
    :param ochl: tuple with open, close, high, low     
    :return: tuple with open, rel_close, rel_high, rel_low
    """   
    assert isinstance(prices, Prices)            
    rh = (prices.high - prices.open) / prices.open
    rl = (prices.low - prices.open) / prices.open
    rc = (prices.close - prices.open) / prices.open
    tm = prices.time
    return Prices(time=tm, open=prices.open, high=rh, low=rl, close=rc, volume=prices.volume)


def load_relative(csv_file):
    return prices_to_relative(read_csv(csv_file))


def price_files(dir_name):
    result = []
    for path in glob.glob(os.path.join(dir_name, "*.csv")):
        result.append(path)
    return result


def load_year_data(year, basedir='data'):
    y = str(year)[-2:] 
    result = {}        
    for path in glob.glob(os.path.join(basedir, "*_%s*.csv" % y)):
        result[path] = load_relative(path)
    return result      


load_relative(read_csv('/home/darfeder/Downloads/9781838826994_Code/Chapter10/data/YNDX_150101_151231.csv'))

我得到了一个错误:

TypeError:应为str、字节或os。像路径一样的对象,而不是价格

加载的csv文件如下所示:

错误在"prices_to_relative"函数中

堆栈跟踪:

---------------------------------------------------------------------------87 88中的TypeError回溯(最近一次通话)---

load_relative(csv_file)69 70 defload_relative(csv_file):---

read_csv(file_name, sep,filter_data,fix_open_price)11 defread_csv(file_name, sep=',',filter_data=True,fix_open_price=False): 12 print("Read",file_name)---

TypeError:应为str、字节或os。像路径一样的对象,而不是价格

共有1个答案

金晗日
2023-03-14

你的代码看起来很奇怪-当我只想看到一个时,有几个调用read_csv,例如:

总的来说:

load_relative(read_csv('/home/darfeder/Downloads/9781838826994_Code/Chapter10/data/YNDX_150101_151231.csv'))

在load_relative中:

return prices_to_relative(read_csv(csv_file))

在read_csv中,是递归调用吗?(我想这可能还可以,适合使用;作为CSV分隔符):

return read_csv(file_name, ';') 

我想说的是第一个问题:传递文件名而不是读取文件的结果,所以将其更改为:

load_relative('/home/darfeder/Downloads/9781838826994_Code/Chapter10/data/YNDX_150101_151231.csv')

此外,您应该打开csv文件,而不指定“rt”,并根据留档示例指定newline=https://docs.python.org/3/library/csv.html,因此更改:

with open(file_name, 'rt', encoding='utf-8') as fd:

致:

with open(file_name, newline='', encoding='utf-8') as fd:

由于您没有提供样本数据,我没有办法对此进行测试——希望这些建议能解决问题。

 类似资料:
  • 我学习Python才几个星期,这个问题难倒了我。我试图创建一个简单的塔防风格的游戏使用Pyplay。已经在谷歌上搜索和研究了4个多小时(pyplay docs网站在发布时已经关闭,依赖于缓存版本)。我相信它最终会变得非常容易修复,但我没有主意了。 我把塔类放在一个文件中,主游戏循环放在另一个文件中。图像文件存储在名为“资产”的文件夹中,该文件夹与tower类和主游戏循环位于同一目录中。当我试图创建

  • 我在一个保存为记事本文件的文件中有以下简单的json 我正在尝试使用打开它 我已经尝试按照本页的建议创建绝对路径,但它也会产生值错误。有人能帮忙吗?

  • 我是机器学习的初学者,目前正在尝试将VGG网络应用于我的神经网络 这是发生的错误 发现714幅图像,分属10类。发现100个图像,属于 到10个班。------------------------------------------------------------------------------------------------------------------------------

  • 当我试图在Python中打印CSV文件的内容时,我得到了这个错误。 回溯(最近调用最后):文件“/users/cassandracampbell/library/preferences/pycharmce2018.2/scratches/player.py”,第5行,在打开('player.csv')的csvfile:filenotfounderror:[errno2]中没有这样的文件或目录:'p

  • 问题内容: 我有以下抛出的非常基本的代码; 我尝试将解码设置为Data变量,如下所示,但是会引发相同的错误; 有什么建议? 问题答案: 您只是将其以错误的顺序放置,是无辜的错误。 (深入解答)。正如wim礼貌地指出的那样,在极少数情况下,他们可以选择UTF-16或UTF-32。在这种情况下,对于开发人员而言,这种情况将不那么常见,在这种情况下,他们将有意识地决定放弃宝贵的带宽。因此,如果遇到编码问

  • 问题内容: 这是我的代码: 此时,我收到错误消息 Python 3不再具有解码了,对吗?我怎样才能解决这个问题? 另外,在: 我只选择第一封电子邮件。如何选择全部? 问题答案: 您正在尝试解码 已解码 的对象。您有一个,不再需要从UTF-8解码。 只需删除部分: 至于您的通话,您明确要求仅发送第一条消息。如果要检索更多消息,请使用范围。请参阅文档: 下面命令的 message_set 选项是一个字