0

我正在编写一个简单的程序来在导入文本文件后输出基本图形。我收到以下错误:

Traceback (most recent call last):
  File "C:\Users\Chris1\Desktop\attempt2\ex1.py", line 13, in <module>
    x.append(int(xAndY[0]))
ValueError: invalid literal for int() with base 10: '270.286'

我的 python 代码如下所示:

    import matplotlib.pyplot as plt

x = []
y = []

readFile = open ('temp.txt', 'r')

sepFile = readFile.read().split('\n')
readFile.close()

for plotPair in sepFile:
    xAndY = plotPair.split(',')
    x.append(int(xAndY[0]))
    y.append(int(xAndY[1]))

print x
print y



plt.plot(x, y)

plt.title('example 1')
plt.xlabel('D')
plt.ylabel('Frequency')

plt.show()    

我的文本文件片段如下所示:

270.286,4.353,16968.982,1903.115
38.934,68.608,16909.727,1930.394    
190.989,1.148,16785.367,1969.925         

这个问题似乎很小,但似乎无法自己解决,谢谢

4

2 回答 2

0

这很简单,只需将int转换替换为float

for plotPair in sepFile:
    xAndY = plotPair.split(',')
    x.append(float(xAndY[0]))
    y.append(float(xAndY[1]))

这将修复错误。

于 2013-07-19T14:19:12.030 回答
0

一个办法

如果要将浮点值转换为整数,只需更改

x.append(int(xAndY[0]))
y.append(int(xAndY[1]))

x.append(int(float(xAndY[0])))
y.append(int(float(xAndY[1])))

在此处输入图像描述

您收到错误的原因

您收到错误是因为内置函数int不接受浮点数的字符串表示形式作为其参数。从文档中:

int ( x=0 )
int ( x, base=10 )
...
如果x不是数字或如果给定了 base,则x必须是字符串或 Unicode 对象,表示以基数为基数的整数文字。可选地,文字可以在前面加上 + 或 - (中间没有空格)并被空格包围。base-n 文字由数字 0 到 n-1 组成,其中 a 到 z(或 A 到 Z)的值是 10 到 35。

在您的情况下(x不是数字,而是浮点数的字符串表示形式),这意味着该函数不知道如何转换该值。这是因为使用base=10时,参数只能包含数字 [0-9],即不能包含.(点),这意味着字符串不能是浮点数的表示。


更好的解决方案

我建议您查看numpy.loadtxt,因为这更容易使用:

x, y = np.loadtxt('temp.txt',     # Load values from the file 'temp.txt'
                  dtype=int,      # Convert values to integers
                  delimiter=',',  # Comma separated values
                  unpack=True,    # Unpack to several variables
                  usecols=(0,1))  # Use only columns 0 and 1

更正后,它会产生与您的代码相同的x列表。y

通过此修改,您的代码可以缩减为

import matplotlib.pyplot as plt
import numpy as np

x, y = np.loadtxt('temp.txt', dtype=int, delimiter=',',
                  unpack=True, usecols=(0,1))

plt.plot(x, y)

plt.title('example 1')
plt.xlabel('D')
plt.ylabel('Frequency')

plt.show()
于 2013-07-19T14:19:58.233 回答