读取简单的数据文件操作字符串。

2024-06-02 08:22:40 发布

您现在位置:Python中文网/ 问答频道 /正文

如果给我:

 point_loads, 3, 500
 point_loads, 6, 900
 point_loads, 12, 300

此代码:

 for line in open("Input.txt"):
      li=line.strip()
      if li.startswith("point_load"):
         l = li.split(',')
         for num in l[1:]:
             num = float(num.strip())
             point_loads.append(num)

印刷品:

 point_loads = [3, 500, 6, 900, 12, 300]

我正在尝试修改它,以便如果给我:

 length = 32

 point_loads, 3, 500
 point_loads, 6, 900
 point_loads, end, 300

它将“end”设置为32(或可变长度),以便输出为:

 point_loads = [3, 500, 6, 900, 32, 300]

我尝试了一些不同的东西,这是我最新的

 for line in open("Input.txt"):
      li=line.strip()
      if li.startswith("point_load"):
         l = li.split(',')
         for num in l[1:]:
             if num == 'end':
                  num = 10
             num = float(num.strip())
             point_loads.append(num)

但它给了我一个错误:(加上它不会真正做到我想要的,但这是一个开始)

     num = float(num.strip())
     ValueError: could not convert string to float: 'end'

调试时,我可以看到我需要剥离字符串,这样它就不会在“end”上执行操作

我已经试着在不同的代码位上乱搞了几个小时,但是没有任何进展

这部分有什么建议吗

谢谢你


Tags: 代码intxtforinputiflineli
2条回答

如果我理解您的问题,您将无法将字符串“end”与您选择的变量交换。根据您所说的,这是因为您没有首先正确匹配字符串。当您用逗号分隔行时,仍然会得到每个项的空格

'point_loads, end, 300'.split()以`['点加载','结束','300'结束]

为了解决这个问题,我会首先过滤您的行,以剥离分割后每个项目的所有空白。然后当您测试if num == 'end'时,您将得到True。您当前的代码正在测试if 'end' == ' end',也就是False

point_loads = []

with open(path, 'r') as f:
    for line in f:
        li = line.strip()
        if li.startswith("point_load"):
            l = li.split(',')
            l = [x.strip() for x in l]  # strip whitespace from each item
            for num in l[1:]:
                if num == 'end':
                    num = 10.
                else:
                    num = float(num.strip())
                point_loads.append(num)

我注意到问题的第二部分与Python和duck类型的性质有关。您正在尝试对int和string调用strip()方法。在我上面的代码中,如果它与您的字符串匹配,它将分配一个int,否则它将把字符串转换为int,从而避免了试图调用int上的strip的问题

我修改了代码-我打了个错字,在列表中用了split()而不是strip()。我在python3.6中测试过这个,但在python2.7中也应该可以。我添加了一个适当的上下文管理器来打开文件,您应该一直这样做

我不确定。但这可能是你想要的

for line in open("Input.txt"):
    li = line.strip()
    if li.startswith("point_load"):
        l = li.split(', ')
        for num in l[1:]:
            if num == 'end':
                num = '10'
            num = float(num.strip())
            point_loads.append(num)
  1. l = li.split(',')转到l = li.split(', '),同时使用, to split string to list
  2. num = 10转到num = '10'使所有元素都是字符串来调用strip()

相关问题 更多 >