Python文件读写

6

我正在从一款自定义MSSQL CMS迁移数据库到MYSQL - Wordpress。我使用Python读取一个以\t为分隔符的列和每行一个记录的txt文件。

我正在尝试编写一个Python脚本来读取这个文件(fread),并最终创建一个包含插入语句的MYSSQL可用的.sql文件。

我要读取的文件中的一行看起来像这样:

1    John Smith    Developer  http://twiiter.com/johns   Chicago, IL

我目前的Python脚本:

import sys

fwrite = open('d:/icm_db/wp_sql/wp.users.sql','w')

fread = open('d:/icm_db/users.txt','r')

for line in fread:
    print line;


fread.close()
fwrite.close()

我该如何“implode”每一行,以便可以访问每个列并进行业务操作?
我需要为每行生成多个MYSQL插入语句。因此...对于每行读取,我会生成类似以下的内容:
INSERT INTO `wp_users` (`ID`, `user_login`, `user_name`) 
VALUES (line[0], 'line[2]', 'line[3]');
5个回答

10

虽然这很容易实现,但使用csv模块会更加简单。

>>> import csv
>>> reader = csv.reader(open('C:/www/stackoverflow.txt'), delimiter='\t')
>>> for row in reader:
...     print row
...
['1', 'John Smith', 'Developer', 'http://twiiter.com/johns', 'Chicago, IL']
['2', 'John Doe', 'Developer', 'http://whatever.com', 'Tallahassee, FL']

此外,正如指出的那样,在Python中不需要分号。尝试摆脱这个习惯 :)

2
...当你开始在Python中打高尔夫球时,可以重新养成那个习惯 :| - Dave

1
了解准确的列数有助于自我记录代码:
fwrite = open("d:/icm_db/wp_sql/wp.users.sql","w")

for line in open("d:/icm_db/users.txt"):
  name, title, login, location = line.strip().split("\t")

  # Double up on those single quotes to avoid nasty SQL!
  safe_name = name.replace("'","''")
  safe_login = name.replace("'","''")

  # ID field is primary key and will auto-increment
  fwrite.write( "INSERT INTO `wp_users` (`user_login`, `user_name`) " )
  fwrite.write( "VALUES ('%s','%s');\n" % (safe_name,safe_login) )

0
fwrite = open('/home/lyrae/Desktop/E/wp.users.sql','a')
fread = open('/home/lyrae/Desktop/E/users.txt','r')

for line in fread:
    line = line.split("\t")
    fwrite.write("insert into wp_users ( ID, user_login, user_name ) values (%s, '%s', '%s')\n" % (line[0], line[1], line[2]))

fread.close()
fwrite.close()

假设users.txt文件如下:
1   John Smith  Developer   http://twiiter.com/johns    Chicago, IL
2   Billy bob   Developer   http://twiiter.com/johns    Chicago, IL
3   John Smith  Developer   http://twiiter.com/johns    Chicago, IL

wp.users.sql 会长成这个样子:

insert into wp_users ( ID, user_login, user_name ) values (1, 'John Smith', 'Developer')
insert into wp_users ( ID, user_login, user_name ) values (2, 'Billy bob', 'Developer')
insert into wp_users ( ID, user_login, user_name ) values (3, 'John Smith', 'Developer')

假设只有一个制表符分隔id、名称和位置


0
你可能想要的是这样的代码: data=line.split("\t")
它会给你一个很好的序列对象来处理。
(顺便说一下,在Python中不需要分号。这里有一个:print line;

正如Dave指出的那样,这可能会留下一个换行符。在拆分之前调用strip()函数,像这样:line.strip().split("\t")


1
这可能会在最后一个字段留下一个换行符。 - Dave
那么 line.strip().split("\t") 呢? - Etienne Perot
吃掉所有前导和尾随的空格,而不仅仅是换行符。这可能是一个问题,也可能不是。 - Dave
在这种情况下,我认为不是这样的,这只是一个小型的一次性脚本来完成他的要求。split()方法不适用于实际应用,他最好使用csv模块,就像其他解决方案所说的那样。 - Etienne Perot

0
Python标准库有一个模块CSV(逗号分隔值)文件读写,可以用于处理制表符分隔的文件,就像你的文件一样。但对于这个任务来说,它可能过于复杂了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接