我在NLP上工作,需要做一些数据的预处理。我有两个输入文件,并且必须生成一个输出文件,其中第一个文件作为键。
文件1-包含单词列表:
辅助
从…
这个
诗歌
转到
文件2:
0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.016801 -0.33279 -0.1552 -0.23131 -0.19181 -1.8823 -0.76746 0.099051 -0.42125 -0.19526 4.0071 -0.18594 -0.52287 -0.31681 0.00059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637 -0.44251 0.18785 0.0027849 -0.18411 -0.11514 -0.78581 of 0.70853 0.57088 -0.4716 0.18048 0.54449 0.72603 0.18157 -0.52393 0.10381 -0.17566 0.078852 -0.36216 -0.11829 -0.83336 0.11917-0.16605 0.061555 -0.012719 -0.56623 0.013616 0.22851 -0.14396 -0.067549 -0.38157 -0.23698 -1.7037 -0.86692 -0.26704 -0.2589 0.1767 3.8676 -0.1613 -0.13273 -0.68881 0.18444 0.0052464 -0.33874 -0.078956 0.24185 0.36576 -0.34727 0.28483 0.075693 -0.062178 -0.38988 0.22902 -0.21617 -0.22562-0.093918 -0.80375至0.68047 -0.039263 0.30186 -0.17792 0.42962 0.032246 -0.41376 0.13228 -0.29847 -0.085253 0.17118 0.22419 -0.10046 -0.43653 0.33418 0.67846 0.057204 -0.34448 -0.42785 -0.43275 0.55963 0.10032 0.18677 -0.26854 0.037334 -2.0932 0.22171 -0.39868 0.20912 -0.55725 3.8826 0.47466 -0.95658 -0.37788 0.20869 -0.32752 0.12751 0.088359 0.16351 -0.21634 -0.094375 0.018324 0.21048 -0.03088 -0.19722 0.082279 -0.09434 -0.073297 -0.064699 -0.26044和0.26818 0.14346 -0.27877 0.016257 0.11384 0.69923 -0.51332 -0.47368 -0.33075 -0.13834 0.2702 0.30938 -0.45012 -0.4127 -0.09932 0.038085 0.029749 0.10076 -0.25058 -0.51818 0.34558 0.44922 0.48791 -0.080866 -0.10121 -1.3777 -0.10866 -0.23201 0.012839 -0.46508 3.8463 0.31362 0.13643 -0.52244 0.3302 0.33707 -0.35601 0.32431 0.12041 0.3512 -0.069043 0.36885 0.25168 -0.24517 0.25381 0.1367 -0.31178 -0.6321 -0.25028 -0.38097
我希望在新文件(文件3)中的输出应该是:
0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.016801 -0.33279 -0.1552 -0.23131 -0.19181 -1.8823 -0.76746 0.099051 -0.42125 -0.19526 4.0071 -0.18594 -0.52287 -0.31681 0.00059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637 -0.44251 0.18785 0.0027849 -0.18411 -0.11514 -0.78581至0.68047 -0.039263 0.30186 -0.17792 0.42962 0.032246 -0.41376 0.13228 -0.29847 -0.085253 0.17118 0.22419 -0.10046 -0.43653 0.33418 0.67846 0.057204 -0.34448 -0.42785 -0.43275 0.55963 0.10032 0.18677 -0.26854 0.037334 -2.0932 0.22171 -0.39868 0.20912 -0.55725 3.8826 0.47466 -0.95658 -0.37788 0.20869 -0.32752 0.12751 0.088359 0.16351 -0.21634 -0.094375 0.018324 0.21048 -0.03088 -0.19722 0.082279 -0.09434 -0.073297 -0.064699 -0.26044
下面的代码运行时没有任何错误,但是我得到的输出文件是空的:
f1 = open('input_key.txt', 'r')
f2 = open('input_file.txt', 'r')
f3 = open('output_file.txt', 'w')
for word in f1.readlines():
for line in f2.readlines():
if word is line.strip().split()[0]:
f3.write(line)
f1.close()
f2.close()
f3.close()
我不明白这里出了什么问题。感谢您的帮助。file2和file3之间没有额外的行。我只是添加了这些,以使问题更具可读性。
更新
多亏了这些注释,我才知道if语句的计算结果为false。有没有办法克服这一点或其他替代方案来执行我的任务?
发布于 2018-06-09 03:56:19
这将完成您想要它做的事情:
f1 = open('input_key.txt', 'r')
f2 = open('input_file.txt', 'r')
f3 = open('output_file.txt', 'a')
for word in f1.readlines():
for line in f2.readlines():
if line != '\n' and word.strip() == line.strip().split()[0]:
f3.write(line)
f2.seek(0)
f1.close()
f2.close()
f3.close()
您需要使用f2.seek(0)
在每个循环结束时重置readlines
的光标位置
我还会将output_file.txt
作为a
(append)打开,您可以删除脚本开头的output_file.txt
,以便在每次运行它时将其清除:
import os
os.remove("output_file.txt")
我也会做==
而不是is
,is
将测试两个对象是否相同,而不是测试某个对象是否等于其他对象
编辑:我会看看下面wiesion关于list comprehension
的答案,以获得一些编写更干净代码的提示
发布于 2018-06-09 03:47:16
关键字is
是标识操作符,用于检查两个元素是否具有相同的标识
==
是相等逻辑运算符
if word is line.strip().split()[0]:
将其更改为
if word == line.strip().split()[0]:
发布于 2018-06-09 04:06:51
我只是复制了你的文件并编写了代码,如果我得到了你的要求,我就会这样做:
with open("words.txt", "r") as word_file:
words = [word.strip() for word in word_file.read().splitlines() if word.strip()]
with open("feed.txt", "r") as feed_file:
lines = [line.strip() for line in feed_file.read().splitlines() if line.strip()]
with open('result.txt', 'w') as result_file:
result_file.write("\n".join([line for line in lines if line.split()[0] in words]))
当然,我在这里做了相当多的list comprehensions来避免所有的嵌套循环。
如果您的word和输入文件很大,那么您应该避免使用理解将整个文件读取到内存中(感谢@Bayko的提醒),并且您应该切换到:
words = []
with open("words.txt", "r") as word_file:
# This reads the words file line by line instead of reading the entire file
for word in word_file:
word = word.strip()
if word:
words.append(word)
with open('result.txt', 'w') as result_file:
with open("feed.txt", "r") as feed_file:
# This reads the input file line by line instead of reading the entire file
for line in feed_file:
line = line.strip()
if not line:
continue
if line.split()[0] in words:
result_file.write(line + "\n")
另外,当我在本地运行您的代码时:
如果word为line.strip(),则为
.split() IndexError:列表索引超出范围
这个错误是由于空行而发生的--但最重要的是,你被f2.readlines()
卡住了--你永远不会执行f2.seek(0)
来重置位置,而且==
与is
不同(参见@Atterson的答案)。修复代码中的这些问题将如下所示:
f1 = open('words.txt', 'r')
f2 = open('feed.txt', 'r')
f3 = open('result.txt', 'w')
for word in f1.readlines():
word = word.strip()
if not word:
continue
for line in f2.readlines():
line = line.strip()
if not line:
continue
if word == line.split()[0]:
f3.write(line + "\n")
f2.seek(0)
f1.close()
f2.close()
f3.close()
使用这两个脚本,我的result.txt
如下所示
0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862 -0.00066023 -0.6566 0.27843 -0.14767 -0.55677 0.14658 -0.0095095 0.011658 0.10204 -0.12792 -0.8443 -0.12181 -0.016801 -0.33279 -0.1552 -0.23131 -0.19181 -1.8823 -0.76746 0.099051 -0.42125 -0.19526 4.0071 -0.18594 -0.52287 -0.31681 0.00059213 0.0074449 0.17778 -0.15897 0.012041 -0.054223 -0.29871 -0.15749 -0.34758 -0.045637 -0.44251 0.18785 0.0027849 -0.18411 -0.11514 -0.78581
至0.68047 -0.039263 0.30186 -0.17792 0.42962 0.032246 -0.41376 0.13228 -0.29847 -0.085253 0.17118 0.22419 -0.10046 -0.43653 0.33418 0.67846 0.057204 -0.34448 -0.42785 -0.43275 0.55963 0.10032 0.18677 -0.26854 0.037334 -2.0932 0.22171 -0.39868 0.20912 -0.55725 3.8826 0.47466 -0.95658 -0.37788 0.20869 -0.32752 0.12751 0.088359 0.16351 -0.21634 -0.094375 0.018324 0.21048 -0.03088 -0.19722 0.082279 -0.09434 -0.073297 -0.064699 -0.26044
https://stackoverflow.com/questions/50767301
复制相似问题