TypeError:int()参数必须是字符串、byteslike对象或数字,而不是“\u io.TextIOWrapper”

2024-06-07 15:45:18 发布

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

我试图以整数的形式逐行读取文本文件。我做了我在这里看到的每一个建议,但没有一个对我有效。这是我正在使用的代码。它从datadir读取一些地震数据,并评估信噪比,以决定是保留数据还是删除数据。要做到这一点,我需要计算台站和地震之间的距离,这些信息来自输入文件

from obspy import UTCDateTime
import os

datadir = "/home/alireza/Desktop/Saman/Eqcomplete"
homedir = "/home/alireza/Desktop/Saman"

eventlist = os.path.join (homedir, 'events.dat')
stationlist = os.path.join (homedir, 'all_st')

e = open (eventlist, "r")
for event in e.readlines():
    year, mon, day, time, lat, lon = event.split (" ")
    h = str (time.split (":")[0])   # hour
    m = str (time.split (":")[1])   # minute
    s = str (time.split (":")[2])   # second

    s = open (stationlist, "r")
    for station in s.readlines():
        stname, stlo, stla = station.split (" ")
        OafterB = UTCDateTime (int(year), int(mon), int(day), int(h), int(m), int(s))
        print (OafterB)     # just to have an output!
    s.close ()
e.close ()`
  • 更新:
  • 有两个输入文件:
  1. events.dat类似于:
2020 03 18 17:45:39 -11.0521 115.1378
  1. 所有类似于:
  AHWZ 48.644 31.430
  AFRZ 59.015 33.525
  NHDN 60.050 31.493
  BDRS 48.881 34.054
  BMDN 48.825 33.772
  HAGD 49.139 34.922

以下是输出:

Traceback (most recent call last):
  File "SNR.py", line 21, in <module>
    OafterB = UTCDateTime (int(year), int(mon), int(day), int(h), int(m), int(s))
TypeError: int() argument must be a string, a bytes-like object or a number, not '_io.TextIOWrapper'

这里测试安装obspy包所需的代码。 pip install obspy可能有效


Tags: 数据代码intimeosyearintsplit
1条回答
网友
1楼 · 发布于 2024-06-07 15:45:18

您可以在此处定义s

s = str (time.split (":")[2])   # second

但是,紧接着,你就对它进行了改进:

s = open (stationlist, "r")

现在s指向一个文件对象,因此int(s)由于上述错误而失败。将站点列表文件对象命名为不同的名称,问题就会消失


您可能会发现其他有用的提示:

  • split()将自动在空白处拆分,除非您另行通知,因此无需指定" "
  • 您可以使用多重赋值来赋值hms,方法与前一行相同。目前,您正在三次执行相同的拆分操作
  • 建议使用^{}关键字打开文件,即使发生异常,该关键字也会自动处理关闭文件的操作
  • 您可以直接迭代文件对象,而无需使用readlines()创建列表
  • 使用pathlib可以使处理文件系统路径和分隔符变得更加简单和干净
  • 在函数名和括号之间加空格被认为是不好的形式
  • 还有一个约定,变量名(类名除外)通常都是小写的,根据需要在单词之间加下划线(请参阅PEP 8以获得所有此类样式约定的有用摘要。它们不是硬性规则,但可以帮助使代码更加一致和可读。)

考虑到这些因素,下面是上述代码的一个稍加修饰的版本:

from pathlib import Path
from obspy import UTCDateTime

data_dir = Path('/home/alireza/Desktop/Saman/Eqcomplete')
home_dir = Path('/home/alireza/Desktop/Saman')

event_list = home_dir / 'events.dat'
station_list = home_dir / 'all_st'

with open(event_list) as e_file:
    for event in e_file:
        year, mon, day, time, lat, lon = event.split()
        h, m, s = time.split(':')

        with open(station_list) as s_file:
            for station in s_file:
                stname, stlo, stla = station.split()
                o_after_b = UTCDateTime(
                    int(year), int(mon), int(day), int(h), int(m), int(s)
                )
                print(o_after_b)

相关问题 更多 >

    热门问题