【问题标题】:Write in a column of a csv formatted file after n lines?在 n 行之后写入 csv 格式文件的列?
【发布时间】:2018-11-24 17:26:04
【问题描述】:

我是 python 新手。 我在处理 csv 文件时遇到问题。 这是一个有 12 行标题的文件,然后开始数据。 我必须从列中读取一些数据(这没关系),经过详细说明,我必须在同一个文件中添加一个列,每行都有一个值,但第一列没有任何 id,并且该列必须开始从第 13 行开始,而不是从第一行开始。

我尝试过使用 pandas 库,但它不起作用

df = pd.read_csv("./1540476113.gt.tie")
df["package"] = pd.Series(packages)
df.to_csv("./1540476113.gt.tie", sep = "\t")

其中 package 是列的名称(但我也知道索引), packages 是字符串数组(我必须编写的元素)。 此代码有效,但从第一行开始添加(我不知道如何设置偏移量)并将第一列中的索引(不需要)和每个元素之前的 char ' 添加到文件中。 sep 是每列的分隔符。

示例输入数据:

# TIE output version: 1.0 (text format)
# generated by: . -a ndping_1.0 -r /home/giuseppe/Scrivania/gruppo30/1540476113/traffic.pcap

# Working Mode: off-line
# Session Type: biflow
# 1 plugins enabled: ndping

# begin trace interval: 1540476116.42434

# begin TIE Table
# id    src_ip          dst_ip          proto   sport   dport   dwpkts  uppkts  dwbytes upbytes t_start                 t_last                  app_id  sub_id  app_details     confidence
17      192.168.20.105  216.58.205.42   6       50854   443     8       9       1507    1728    1540476136.698920       1540476136.879543       501     0       Google  100
26      192.168.20.105  151.101.66.202  6       40107   443     15      18      5874    1882    1540476194.196948       1540476204.641949       501     0       SSL_with_certificate    100
27      192.168.20.105  31.13.90.2      6       48133   443     10      15      4991    1598    1540476194.218949       1540476196.358946       501     0       Facebook        100

样本输出数据:

# TIE output version: 1.0 (text format)
# generated by: . -a ndping_1.0 -r           /home/giuseppe/Scrivania/gruppo30/1540476113/traffic.pcap 

# Working Mode: off-line
# Session Type: biflow 
# 1 plugins enabled: ndping 

# begin trace interval: 1540476116.42434

# begin TIE Table
# id    src_ip      dst_ip      proto   sport   dport   dwpkts  uppkts  dwbytes upbytes t_start         t_last          app_id  sub_id  app_details confidence  package
17  192.168.20.105  216.58.205.42   6   50854   443 8   9   1507    1728    1540476136.698920   1540476136.879543   501 0   Google  100  N/C    
26  192.168.20.105  151.101.66.202  6   40107   443 15  18  5874    1882    1540476194.196948   1540476204.641949   501 0   SSL_with_certificate    100 com.joelapenna.foursquared
27  192.168.20.105  31.13.90.2  6   48133   443 10  15  4991    1598    1540476194.218949   1540476196.358946   501 0   Facebook    100 com.joelapenna.foursquared  
38  192.168.20.105  13.32.71.69 6   52108   443 9   12  5297    2062    1540476195.492946   1540476308.604998   501 0   SSL_with_certificate    100 com.joelapenna.foursquared
0   34.246.212.92   192.168.20.105  6   443 37981   3   2   187 98  1540476116.042434   1540476189.868844   0   0   Other TCP   0   N/C
29  192.168.20.105  13.32.123.222   6   36481   443 11  15  6638    1914    1540476194.376945   1540476308.572998   501 0   SSL_with_certificate    100 com.joelapenna.foursquared  
31  192.168.20.105  8.8.8.8 17  1219    53  1   1   253 68  1540476194.898945   1540476194.931198   501 0   DNS 100

我不关心alinemen,每列的分隔符是'\t'。

【问题讨论】:

标签: python pandas csv dataframe file-io


【解决方案1】:

您可以通过将一些参数传递给read_csv 来跳至数据。

df = pd.read_csv("./1540476113.gt.tie", header=None, skiprows=12)
df["package"] = pd.Series(packages)
df.to_csv("./1540476113.gt.tie", sep = "\t")

然后明确命名您的列:

df.columns = [col_names]

如果第 13 行是带有您想要的列名的标题行,则不要传递 header=None 参数。

在文档here 中查看更多信息。

【讨论】:

  • 我试过这个(df = pd.read_csv("./1540476113.gt.tie",header=None,skiprows=11) df["package"] = pd.Series(packages) df.columns = ["package"] df.to_csv("./1540476113.gt.tie", sep = "\t") 因为在文件中第 12 行仍然是标题,但我必须插入列标签。但是它不起作用并告诉我错误:ValueError: Length mismatch: Expected axis has 2 elements, new values have 1 elements 删除'code'f.columns=[col_names]它会跳过标题在新文件中并删除它!
  • 你写的是df.columns = ['package']而不是df.columns = ['id', ......, 'package']
  • 我试图传递所有列名的数组,但错误是 ValueError: Length mismatch: Expected 2 elements, new values have 23 elements 23 不好但仅仅因为某些列有两个 '\t' 作为分隔符,我可以更正但不是两列!
  • @GiuseppeFerrara 尝试只读取数据而不跳过行和header=None,然后使用df.iloc[data_start_row:, [col_indices]] 只切片您需要的数据。之后,确保列名列表的长度与列索引列表的长度匹配。
猜你喜欢
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 2017-10-22
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多