【问题标题】:Reading from file and formatting into two dimensional array从文件中读取并格式化为二维数组
【发布时间】:2021-08-21 20:50:02
【问题描述】:

我正在尝试从多个文本文件中读取数据并将数据移动到二维数组中。数据需要保持特定的顺序。


正则表达式可以帮助解决这个问题吗?


如果您对如何改进这部分代码有任何见解,请告诉我。

【问题讨论】:

  • 为什么不从文件的第 3 行获取年份?

标签: python arrays text split strip


【解决方案1】:

datetime module 提供(大多数)与日期相关的所有内容

from datetime import datetime

date = "Sat 30-Mar-1996 7:40 PM"
fmt = "%a %d-%b-%Y %I:%M %p"
a = datetime.strptime(date, fmt)
print(a.year)
>>> 1996

【讨论】:

    【解决方案2】:

    您可以通过拆分其组件并使用iterable unpacking 来非常轻松地解析日期时间字符串,例如,

    def parse_date(d):
        day_of_week, date, hhmm, ampm =  d.split()
        day_of_month, month, year = date.split('-')
        hour, minute = hhmm.split(':')
        return (year, month, day_of_month,
                ​hour if ampm=='AM' or str(int(hour)+12), minute,
                day_of_week)
    

    之后,在循环体中

    year, m, dom, ​h, m, dow  = parse_date(fields[-1].strip())
    

    或者,如果您只对year感兴趣

    year, *_ = parse_date(fields[-1].strip())
    

    【讨论】:

      【解决方案3】:

      您可能正在寻找正则表达式,这是一种非常强大的分析和提取字符串数据的方法。有关它们的介绍,我会查看 this sitethe python docs,但在你的情况下,我认为你可能想要类似 '| ([a-zA-Z]*) ([0-9]*)-([a-zA-Z]*)-([0-9]*) ([0-9:]* [a-zA -Z]*) |'会工作。对于 100% 正确的正则表达式 [正则表达式的缩写],需要对时间格式进行更具体的描述。

      要在 python 中使用正则表达式,你需要the re library。首先,使用matcher = re.compile(your_regex_string_here) 创建模式匹配器。然后,找到与result = matcher.match(file_contents) 的匹配项。 (你也可以只做result = re.match(regex_string,file_contents)。)无论你的正则表达式是什么,任何被括号包围的东西都被称为“捕获组”,可以用result.group()从结果中提取; result.group(0) 将返回完全匹配,result.group(n) 将返回第 n 个捕获组的内容 - 即第 n 组括号。在上面的示例中,result.group(4) 将返回年份,但您可以通过使用组 1-5 获得一周中的任何一天、一天、一个月、一年和时间。

      另一个答案中提到的 DateTime 模块也是一个很棒的工具。

      【讨论】:

      • 不,你不需要正则表达式。您需要解析已经在列表中的日期/时间。
      • 这是一个糟糕的正则表达式,它会捕获所有内容。不要试图重写datetime 模块。为这项工作使用正确的工具,而正则表达式不是这项工作的正确工具。
      • 看看 regex101.com 上的this。你有没有想过在发布之前测试你的正则表达式?而且我有点偏离 - 它不匹配每件事,它只匹配每个字符之间,所以所有结果都是None。干得好。
      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多