我的文本文件包含用于设置帐户的电子邮件/密码列表。一旦我使用了电子邮件和密码组合,我想将其从文本文件中删除。
我的文本文件如下所示:
email,pass
email,pass
etc..
一旦我使用了e / p组合,我想从文件中删除它:
File.open("yahoo_accounts.txt") do |email|
email.each do |item|
email, password = item.chomp.split(',')
emails << email
passwords << password
emails.zip(passwords) { |name, pass|
browser = Watir::Browser.new :ff
#using the email and pass
File.open("yahoo_accounts.txt", "w") do |out_file|
File.foreach("yahoo_accounts.txt","r") do |line|
out_file.puts line unless line == '#{name},#{pass}'
end
end
browser.close
end
end
当我尝试从文件中删除它们时会出现问题。我得到一个“browser.rb:382:在`assert_exists'中:浏览器已关闭(Watir :: Exception :: Error)”, 但这可能只是浏览器关闭。
如果在开头提取了所有的e / p(意思是没有什么要删除的话),我怎么能循环它继续前进,而不是在第一个zip循环后结束错误?
答案 0 :(得分:0)
你不能像这样同时写同一个文件;您编写的第一行将破坏文件的其余部分,以便您再也无法阅读它。
您应该在读取行时将更改写入临时文件,然后将临时文件移动到最后的原始文件。类似的东西:
require 'tempfile'
require 'fileutils'
temp_file = Tempfile.new('foo')
begin
File.open("yahoo_accounts.txt", 'r') do |file|
file.each_line do |line|
temp_file.puts line unless line == '#{name},#{pass}'
end
end
temp_file.close
FileUtils.mv(temp_file.path, "yahoo_accounts.txt")
ensure
temp_file.close
temp_file.unlink
end
答案 1 :(得分:0)
如果文件不大,可以将其读入数组,修改数组,然后将数组写入文件,覆盖以前的内容。
<强>代码强>
def remove_lines(fname, user_name, password)
IO.write(fname, IO.read(fname).gsub(/^#{user_name},#{password}\n/, ''))
end
示例强>
让我们创建一些数据:
text =<<_
Bubba,boar
Henrietta,vespa
Luigi,pink
Bubba,boar
Luigi,mauve
_
#=> "Bubba,boar\nHenrietta,vespa\nLuigi,pink\nBubba,boar\nLuigi,mauve\n"
并将其写入文件:
FName = "tmp"
IO.write(FName, text)
#=> 61
我们可以确认我们写入文件的内容:
IO.read(FName)
#=> "Bubba,boar\nHenrietta,vespa\nLuigi,pink\nBubba,boar\nLuigi,mauve\n"
现在删除user_name/password #=> Bubba/boar
:
remove_lines(FName, "Bubba", "boar")
#=> 39
让我们通过检查FName
:
IO.read(FName)
#=> "Henrietta,vespa\nLuigi,pink\nLuigi,mauve\n"
<强>后记强>
如果在将数组写入文件时出现问题,则可能会丢失旧文件和新文件。因此,将数组写入临时文件,然后删除原始文件,然后将临时文件重命名为原始文件的名称通常是一种好习惯。