获取python3中特定字符串部分的数据类型

获取python3中特定字符串部分的数据类型,python,python-3.x,csv,parsing,floating-point,Python,Python 3.x,Csv,Parsing,Floating Point,我在csv文件中输入了-0.02872239612042904,-0.197550028562578。。使用128个值,当我从csv文件中读取该数组时,它会被读取为'-0.02872239612042904,-0.197550028562578..'。我找到了一种方法,可以将所有字符串映射到特定的数据类型。现在我是这样做的:- result=list(map(float, re.findall(r'\d+', en))) #en=string read from csv file 但是,由于

我在csv文件中输入了-0.02872239612042904,-0.197550028562578。。使用128个值,当我从csv文件中读取该数组时,它会被读取为'-0.02872239612042904,-0.197550028562578..'。我找到了一种方法,可以将所有字符串映射到特定的数据类型。现在我是这样做的:-

result=list(map(float, re.findall(r'\d+', en)))  #en=string read from csv file
但是,由于这些是面编码,当计算距离时,它始终返回False,我认为这是因为在转换为字符串后,数组变得像1906684972345829.0,依此类推

我找不到一个数据类型来表示像-0.02872239612042904这样的数字,这就是为什么在映射时我转换成了错误格式的float。谁能告诉我python3中-0.02872239612042904这样的数字的正确数据类型是什么。非常感谢,它现在让我头疼

编辑:- 以下是我从csv文件读取数据的方式:-

def get_encodings():
    df=pd.read_csv('Encodings/encodings.csv')       #getting file
    with tqdm(total=len(list(df.iterrows()))) as prbar:
        encodings=[]
        images=[]
        for index, row in df.iterrows():
            r=[]
            en=df.loc[index,'Encoding']
            print(en)   #prints correctly
            print(type(en))   #prints string and I want exact same data in its original form which looks like I have shown below

"[-0.19053705  0.06230173  0.04058716 -0.08283613 -0.07159504 -0.10155849
  0.06008045 -0.06842063  0.1317966  -0.10250588  0.203399   -0.01436609
 -0.21249449 -0.09238856  0.0279788   0.08926097 -0.09177385 -0.1628615
 -0.03505187 -0.12979373  0.05772705  0.00208503 -0.06933809  0.00741822
 -0.17499965 -0.25000119 -0.0205064  -0.03139503  0.01130889 -0.1057417
  0.13554846  0.06285821 -0.18908061 -0.02082938  0.04383367  0.23148835
 -0.05068404 -0.00925579  0.1900605  -0.05617992 -0.12842563 -0.06219928
  0.07317995  0.26369438  0.10394366  0.05749369  0.02448226 -0.07668396
  0.1266536  -0.23425353  0.04819498  0.07290804  0.111645    0.08294459
  0.10209186 -0.21581331  0.07399686  0.07748453 -0.22381224  0.01746997
  0.0188249  -0.06403829 -0.07789861 -0.0249712   0.21001905  0.03979192
 -0.12171203 -0.06864078  0.21658717 -0.17392246 -0.06753681  0.09808435
 -0.0076007  -0.18134885 -0.23990698  0.07026891  0.3552466   0.17010394
 -0.16684352  0.03726491  0.02757547  0.01445537  0.10094975  0.04033324
 -0.10441576  0.0377433  -0.09693146  0.04404883  0.16759454  0.0402087
 -0.05915016  0.1369293   0.05408669  0.05787617  0.03509152  0.01340439
 -0.06379045  0.04323686 -0.09738267 -0.02683797  0.14505677 -0.10747927
  0.03247242  0.11747092 -0.18656668  0.22448684 -0.00474619 -0.00586929
 -0.05853979  0.06613642 -0.065335    0.02921261  0.08723848 -0.30918318
  0.23265852  0.20364268 -0.07978678  0.19747412  0.08048097  0.04772019
  0.06427031 -0.03703914 -0.14493702 -0.12132056 -0.01301065 -0.02351468
  0.10600268  0.06480799]"

我的数据中有一行看起来像这样,我只希望所有数据在此类型数据类型中不带引号(“如果您有csv,请使用csv模块读取它(或在pandas上读取,它将自动将您的值转换为合适的类型):

创建演示文件:

data =  """-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822
-1.02872239612042904, -1.19755002856254578, 1.31345692434, -1.0009348573822
-2.02872239612042904, -2.19755002856254578, 2.31345692434, -2.0009348573822
-3.02872239612042904, -3.19755002856254578, 3.31345692434, -3.0009348573822
apple, prank, 0.23, nothing
"""

with open("datafile.csv","w") as f:
    f.write(data)
将演示文件读回

def safeFloat(text):
    try:
        return float(text)
    except ValueError: # maybe even catchall here
        return float("nan")

data = []    
import csv
with open("datafile.csv","r") as r:
    csv = csv.reader(r, delimiter=',')
    for l in csv:
        data.append(list(map(safeFloat,l))) # safeFloat to capture errors

print(data)
如果您的数据中有非浮点数,您可能希望在
映射中使用
def safeFloat(text)
而不是
float
来防止解析错误某些文本无法转换为浮点数

输出:

[[-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822], 
 [-1.028722396120429, -1.1975500285625458, 1.31345692434, -1.0009348573822], 
 [-2.028722396120429, -2.1975500285625458, 2.31345692434, -2.0009348573822], 
 [-3.028722396120429, -3.1975500285625458, 3.31345692434, -3.0009348573822], 
 [nan, nan, 0.23, nan]]
      a        b         c         d
0 -0.028722 -0.19755  0.313457 -0.000935
1 -1.028722 -1.19755  1.313457 -1.000935
2 -2.028722 -2.19755  2.313457 -2.000935
3 -3.028722 -3.19755  3.313457 -3.000935

您也可以使用正则表达式,但您的模式需要允许可选符号以及前后的点和数字:

r'[+-]?\d+\.\d+'  # would allow for 123.1245 - but not for 123 or .1234 
                  # would allow an optional +- before numbers
您可以在f.e.处检查模式-此模式和演示数据可在此处找到:


解决方案(仅有效数据):

输出:

[[-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822], 
 [-1.028722396120429, -1.1975500285625458, 1.31345692434, -1.0009348573822], 
 [-2.028722396120429, -2.1975500285625458, 2.31345692434, -2.0009348573822], 
 [-3.028722396120429, -3.1975500285625458, 3.31345692434, -3.0009348573822], 
 [nan, nan, 0.23, nan]]
      a        b         c         d
0 -0.028722 -0.19755  0.313457 -0.000935
1 -1.028722 -1.19755  1.313457 -1.000935
2 -2.028722 -2.19755  2.313457 -2.000935
3 -3.028722 -3.19755  3.313457 -3.000935

@Asim this:应该创建一个pandas数据帧,其中所有类型转换都已完成-无需逐行执行。为其他类型添加了
safeFloat()
readers@Asim您已经检查过,您看到的不仅仅是漂亮的打印变量内容,是吗?-尝试
pd.options.display.float\u format='${:,.20f}“.format
@Asim Pandas会自动为每列选择正确的数据类型-只要一列的任何字段中有一个字符串,整个列就不能用
float
表示-下一个将是“str”然后是“object”(我想)。请参阅-您可能希望
df.apply(pd.to_numeric,errors='concurve'))
-在这种情况下,您将使用NaN替换str。如果您不提供数据框架,则很难解决问题。请使用真实数据编辑您的问题。我已编辑了问题,请现在查看。也非常感谢您尝试解决我的问题:)@Asim-打开另一个问题。您的数据根本不是csv—看起来好像有人将numpy数组的
\uuuu repr\uuuu
打印到了文件中。您可能需要对每一行使用
ast.literal\u eval()
,从中重建列表,而不是将其解析为csv。请看-您可以向它输入一个字符串,并返回一个pythin对象,例如
k=ast。literal_eval(“[1,2,3,4,5]”)将使
k
成为一个包含1到5个整数的python列表-而且您在列表元素之间缺少
,所以它可能是某种numpy输出?