【问题标题】:Writing and reading floats and strings in a CSV file - python在 CSV 文件中写入和读取浮点数和字符串 - python
【发布时间】:2014-10-13 19:36:20
【问题描述】:

我对 python 和编程有点陌生。在我的代码中,我为每个音频文件开发了一个功能(这是一个由 39 个元素组成的一维数组)。我想将文件名、特征及其目标值 {0,1} 写入 CSV 文件以训练我的 SVM 分类器。我使用 CSV 编写器如下。

with open('train.csv', 'a') as csvfile:
    albumwriter = csv.writer(csvfile, delimiter=' ')
    albumwriter.writerow(['1.03 I Want To Hold Your Hand'] + Final_feature + [0] )

我想将大约 180 个音频文件的详细信息写入此 CSV 文件,并将其提供给 SVM 分类器。我用来读取文件的代码是:

with open('train.csv', 'rb') as csvfile:
    albumreader = csv.reader(csvfile, delimiter=' ')
    data = list()
    for row in albumreader:
        data.append(row[0:]) 
data = np.array(data)

我可以使用data[0][1] 访问第一行中的文件名,使用data[0][2] 访问功能,但它们都在<type 'numpy.string_'> 中。我想将该功能转换为浮点列表。主要问题似乎是分隔列表中元素的','。我尝试使用 .astype(np.float) 但徒劳无功。

谁能建议我一个将字符串从 CSV 文件转换回浮点数的好方法?非常感谢您的帮助,因为我完成这个项目的时间非常少。提前致谢。

编辑:根据评论,这就是我的 train.csv 的样子:

"1.01 I saw her standing there" "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38]" 0

"1.02 I saw her" "[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]" 0

"1.03 I want to hold your hand" "[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]" 1

【问题讨论】:

  • 我添加了numpy 标签,因为您显然正试图从nympytype 转换。出于好奇,你为什么要使用 Numpy 来完成这样的任务?
  • 当你给定的代码不使用 Numpy 时,为什么你提到 numpy.string 作为你的数据类型?
  • 哦,对不起.. 我错过了代码的最后一行。我编辑了它。希望清楚。
  • @SylvainLeroux 我不知道你用什么。即使我必须更改代码的结构并使用其他东西也没关系,但我的主要目的是写入和读取带有字符串的列表和浮动列表到 CSV 文件。
  • @Nikki_Champ 如果您能够提供输入数据的 small 示例(即:几行 train.csv )。

标签: python csv numpy svm


【解决方案1】:

将“[1.0, 2.0, 3.0]”之类的字符串转换为列表[1.0, 2.0, 3.0]:

# string to convert
s = '[1.0, 2.0, 3.0]'

lst = [float(x) for x in s[1: -1].split(',')]

# and result will be
[1.0, 2.0, 3.0]

这适用于标准 python 字符串类型和 numpy.string 类型。

【讨论】:

  • s[0: -1] 应该是 s[1: -1] 以跳过 [ 或空格。
【解决方案2】:

我没有得到你想要实现的确切目标,但假设 Final_feature 是一个 python 浮点列表,并且根据你编写 csv 文件的代码 sn-ps,你得到的列表是一个可能看起来像的字符串这个:(你在 data[0][2] 中得到)

feature = '[3.14, 2.12, 4.5]' # 3 elements only for clarity

你问如何将此字符串转换为浮点数,你可以使用:

map(float, feature[1:-1].split(','))

作为参考,map 将其第一个参数应用于其第二个参数的每个元素,从而转换浮点数中的每个字符串并返回浮点数列表。

另一种解决方案是将 Final_feature 的每个元素写在单独的列中。

【讨论】:

  • Final_feature 是一个包含 39 个浮点数的 Python 数组(我将其转换为一个列表),然后再将其写入 CSV 文件。我想在阅读时从 CSV 文件中获取确切的列表。
  • 那么这就是你使用上面的代码 sn-p 得到的结果,如果 data[0][2] 是 "[0, 1, 2, 3, ... 38]" 然后 map( float, data[0][2][1:-1].split(',')) 是原来的float数组。
【解决方案3】:

据我所知,变量Final_feature 是浮点数列表?在什么情况下基于 关于您如何编写文件,以下将导入数据

with open('train.csv', 'rb') as csvfile:
    albumreader = csv.reader(csvfile, delimiter=' ')

    audio_file_names = []
    final_features = []
    target_values = []
    for row in albumreader:
        audio_file_names.append(row[0])
        final_features.append([float(s) for s in row[1:-1]])
        target_values.append([int(s) for s in row[-1]])

有两个list comprehensions 将数据转换为浮点数和整数。

【讨论】:

  • 感谢@Greg 的回答,但它仍然给我同样的错误:final_features.append([float(s) for s in row[1:-1]]) ValueError: could not convert string浮动:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23、24、25、26、27、28、29、30、31、32、33、34、35、36、37、38]
猜你喜欢
  • 2016-11-26
  • 2021-04-06
  • 2019-05-18
  • 2017-08-07
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多