【问题标题】:python file manipulationpython文件操作
【发布时间】:2011-01-23 00:59:20
【问题描述】:

我有一个包含以下条目的文件: 26 1 33 2 . . .

和另一个包含英文句子的文件

我必须编写一个脚本来打印第 26 句中的第一个单词 以及第 33 句中的第二个单词。 我该怎么做?

【问题讨论】:

  • 告诉我们您的文件可以用什么语言编写。如果例如中文,定义“词”。如何确定句子边界?
  • @Xorlev:这是作业。我实际上期待一个教程,它将引导我找到答案,而不是直接答案本身。但是这里的人非常乐于助人;)

标签: python string file


【解决方案1】:

在下面的代码中,我假设句子以'. ' 结尾。您也可以轻松修改它以适应其他句子分隔符。请注意,缩写将因此成为错误的来源。

另外,我将假设单词由空格分隔。

sentences = []
queries = []
english = ""

for line in file2:
    english += line
while english:
    period = english.find('.')
    sentences += english[: period+1].split()
    english = english[period+1 :]
q=""
for line in file1:
    q += " " + line.strip()

q = q.split()
for i in range(0, len(q)-1, 2):
    sentence = q[i]
    word = q[i+1]
    queries.append((sentence, query))

for s, w in queries:
    print sentences[s-1][w-1]

我没有对此进行测试,所以如果它不起作用,请告诉我(最好是破坏它的案例),我会调查错误

希望对你有帮助

【讨论】:

  • q 东西可以一次性构建:q = map(int, file1.read().split()) ...查询东西可以一次性构建:queries = [(q[i], q[i+1]) for i in xrange(0, len(q)-1, 2)] ...您的错误将在最后一行中体现出来,但我已经修复了它,回来:-) 查询和打印也可以结合起来。以上评论已经过与您的代码相同程度的测试:-)
  • 我了解您的 cmets,我通常会使用很多列表理解。但是,这被标记为可能的作业,所以我试图让我的代码更透明
  • 呸。您正在教 n00bs 如何编写丑陋的代码,这些代码将正在发生的事情的本质隐藏在令人毛骨悚然的细节之下。过头了:q += " " + line.strip(),而下一件事是q.strip()。坏习惯:再循环名称:q = q.split()aarrgghh。另一个错误:考虑如果最后一个 '.' 之后有文本会发生什么。更多错误来源:数字 (1.23)、URL (thedailywtf.com)、IP 地址……
  • 首先,我认为没有人会喜欢将用户称为 n00b 以提出他们已标记为作业的问题。我理解你的担忧。他显然处于学习阶段并正在寻求帮助。我很抱歉这么说,但此时称呼他的名字并不是一件好事。这只会让他无缘无故地感到难过。此外,这样做不符合这里培养的社区感觉。由于这是作业,我对输入做了一些假设。也许我应该更清楚地说明这些,但你对初学者的攻击是不必要的。
  • 我真的希望我误解了你所说的,否则你会觉得你很卑鄙。
【解决方案2】:

下面的代码应该可以完成任务。假设文件不是太大。您可能需要进行一些修改以处理边缘情况(例如双空格等)

# Get numers from file
num = []
with open('1.txt') as file:
    num = file.readlines()

# Get text from file    
text = []
with open('2.txt') as file:
    text = file.readlines()

# Parse text into words list.
data = []
for line in text:                    # For each paragraoh in the text
    sentences = l.strip().split('.') # Split it into sentences
    words = []
    for sentence in sentences:       # For each sentence in the text
        words = sentence.split(' ')  # Split it into words list
        if len(words) > 0:
            data.append(words)

# get desired result
for i = range(0, len(num)/2):
     print data[num[i+1]][num[i]]

【讨论】:

  • with 语句中的 Python 语法错误。
  • 问题2:您假设每行有一个数字;这与 OP 的示例不符。问题 3:numstr 对象的列表。如果您实际运行此代码,它会在最后一行尝试使用 str 对象作为列表的索引时崩溃。问题4:range()的参数不正确。
【解决方案3】:

最大的问题是你必须决定用什么来分隔“句子”。例如,'.' 是句子的结尾吗?或者可能是缩写的一部分,例如我刚刚使用的那个?-) 其次,不太困难的是,什么分隔“单词”,例如,“TCP/IP”是一个单词还是两个单词?

一旦您明确定义了这些规则,您就可以轻松地将文本文件读入一个“句子”列表,其中每一个都是“单词”列表。然后,您将另一个文件读取为一系列数字对,并将它们用作整个列表和由此确定的子列表中的索引。但是句词分离的问题确实是最难的部分。

【讨论】:

    【解决方案4】:

    这是一个大致的草图:

    • 将第一个文件读入列表(每个元素中的数字条目)
    • 将第二个文件读入列表(每个元素一个句子)
    • 遍历条目列表,为每个数字找到句子并打印其相关单词

    现在,如果你展示一下你是如何尝试在 Python 中实现它的,你可能会得到更多帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多