【问题标题】:Convert string within matrix row to matrix with rows and columns, and numbers in string to integers将矩阵行中的字符串转换为具有行和列的矩阵,将字符串中的数字转换为整数
【发布时间】:2017-02-06 13:35:07
【问题描述】:

我将 excel 中的工作表保存为 csv 格式。并用代码在python中导入数据后:

import csv
with open('45deg_marbles.csv', 'r') as f:
    reader = csv.reader(f,dialect='excel')
    basis = []
    for row in reader:
        print(row)

输出:

['1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16']
['0.001;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363']
['0.002;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363;11.00127363']
['0.003;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283;10.94525283']

基本上它有 16 列和 1399 行。我意识到每一行都由一个长字符串组成,然后我替换了所有的 ';'使用 ',' 这将有助于将字符串列转换为矩阵,我可以使用该矩阵来操作数据。现在我最终得到一个矩阵,或者更确切地说是包含所有字符串的一行列表。到目前为止,这分别是我在代码和输出方面所拥有的:

import csv
with open('45deg_marbles.csv', 'r') as f:
    reader = csv.reader(f,dialect='excel')
    basis = []
    for row in reader:
        #print(row)

        for i in range(len(row)):
            new_row = (row[i].replace(';', ','))
            basis.append(new_row)

print(basis)


>> ['1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', '0.001,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363', '0.002,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363', '0.003,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', '0.004,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', '0.005,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', '0.006,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', '0.007,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', '0.008,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', '0.009,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', '0.01,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283', ... , '1.396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0', '1.397,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0', '1.398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0']

但这是我想要的矩阵形式,等于:

[[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],[0.001,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363],[0.002,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363,11.00127363], [0.003,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283,10.94525283]]

为了对数据进行操作

我将非常感谢任何帮助。提前谢谢你。

【问题讨论】:

    标签: python python-2.7 python-3.x csv matrix


    【解决方案1】:

    将分隔符更改为分号(默认为逗号,此处不起作用,因为您的输入数据中有分号)(我认为您可以省略dialect='excel' 部分)

    import csv
    
    with open('45deg_marbles.csv', 'r') as f:
        reader = csv.reader(f,dialect='excel',delimiter=";")
        basis = list(reader)
    

    现在basis 是包含文本数据的行列表。

    但您希望它们为整数/浮点数。所以你必须做更多的后处理:如果它是一个整数(负整数也可以),列表理解转换为整数,否则转换为浮点数(如果有字母数字行,当然需要添加另一个测试,但这里不是这种情况)

    import csv,re
    intre = re.compile(r"-?\d+$")
    
    with open('45deg_marbles.csv', 'r') as f:
        reader = csv.reader(f,dialect='excel',delimiter=";")
        basis = []
        for row in reader:
            basis.append([int(x) if intre.match(x) else float(x) for x in row])
    
    print(basis)
    

    结果

    [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], [0.001, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363], [0.002, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363, 11.00127363], [0.003, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283, 10.94525283]]
    

    请注意,如果整数保证为正数,则有一个变体。保存正则表达式评估:

    basis.append([int(x) if x.isdigit() else float(x) for x in row])
    

    【讨论】:

    • 请注意 int(x) if x.isdigit() else float(x) 将负整数转换为 float,但这对于 OP 的目的来说可能没问题。
    • @PM2Ring 同意(没想到这一点)。那时我们需要一个正则表达式。已编辑。
    • 有一种不用正则表达式的方法:stackoverflow.com/a/379966/4014959 但除非大多数输入字符串表示整数,否则这种方法可能会更慢:当不引发异常时,Python 异常非常快速且高效,但是当引发异常时它们会很慢。 OTOH,正则表达式也不是很快......
    • 并且很难处理 listcomp 中的异常。如果数字不能为负数,我添加了替代方法以避免正则表达式(这里似乎是这种情况,似乎只是行索引)
    【解决方案2】:

    你需要做的是

    for row in reader:
        basis.append(row.split(';'))
    

    你做错的是你替换';'使用逗号 ',' 这不会从字符串中创建列表,只是替换此字符串中的符号。虽然您应该将字符串拆分为元素。

    【讨论】:

    • @Johan Sestiger:我不明白你为什么不接受我的另一个答案,因为它不会将值转换为整数/浮点数并使用 csv错误的分隔符,用另一个分隔它!你能至少解释一下吗?
    • @Jean-François Fabre:对不起,我是堆栈交换的新手。我不知道如何接受和/或不接受答案。绿色勾号是切换吗?好的,我明白了。我的道歉。
    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多